ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI1Y2IzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmNfc3NlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hhbGFuLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3htbC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94cGF0aC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0iKm9yZy9lY2xpcHNlL3dzdC94c2wvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49IioqL3ZhbGlkYXRpb24vKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49IioqL3NzZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0iKioveG1sLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NGY2ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotc3JjX3hwYXRoCi14cGF0aGdyYW1tYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjBjZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+SmF2YUNDIE5hdHVyZTwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+c2YuZWNsaXBzZS5qYXZhY2MuamF2YWNjYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPnNmLmVjbGlwc2UuamF2YWNjLmphdmFjY25hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWM0NzQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSNUdWUgTWFyIDE4IDExOjM4OjMzIEdNVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXByb3RlY3RlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByb3RlY3RlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlVW5jaGVja2VkRXhjZXB0aW9ucz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjY0NWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgTWFyIDE4IDExOjM4OjA1IEdNVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMDZhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuWFNMQ29yZVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMi4wLjApIiwKLSBvcmcuYXBhY2hlLmFudDtidW5kbGUtdmVyc2lvbj0iWzEuNy4wLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMTAzLDIuMC4wKSIsCi0gb3JnLmFwYWNoZS54YWxhbjtidW5kbGUtdmVyc2lvbj0iWzIuNy4xLDIuOC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTt1c2VzOj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLmFudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5yZWdpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54aW5jbHVkZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlcjsKLSAgdXNlczo9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwsCi0gICBvcmcueG1sLnNheCwKLSAgIG9yZy54bWwuc2F4LmV4dCwKLSAgIG9yZy54bWwuc2F4LmhlbHBlcnMsCi0gICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTFkNzE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLQkJCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi1kaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci08cD4KLTxzdHJvbmc+WFNMVCBhbmQgWEluY2x1ZGUgU2NoZW1hPC9zdHJvbmc+IDxici8+PGJyLz4KLQotVGhlIGZvbGxvd2luZyBYTUwgU2NoZW1hIGluIHRoZSBwbHVnLWluIGFyZSBiYXNlZCBvbiBXM0MgY29kZSBhdmFpbGFibGUgb24gdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gd2Vic2l0ZQotYW5kIHNoYWxsIGJlIGRlZmluZWQgYXMgdGhlICJXM0MtRGVyaXZlZCBXb3JrIjo8YnIvPjxici8+Ci0KLXhzbHQtc2NoZW1hcy94c2x0LTEuMC54c2QgKGRlcml2ZWQgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMjAwMC8wNHNjaGVtYS1oYWNraW5nL3hzbHQueHNkIj5XM0MgWFNMVCAxLjAgU2NoZW1hPC9hPik8YnIvPgoteHNsdC1zY2hlbWFzL3hzbHQtMi4wLnhzZCAoZGVyaXZlZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDIvc2NoZW1hLWZvci14c2x0MjAueHNkIj5XM0MgWFNMVCAyLjAgU2NoZW1hPC9hPik8YnIvPgoteHNsdC1zY2hlbWFzL3hpbmNsdWRlLnhzZCAoY29waWVkIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGluY2x1ZGUvIj5YSW5jbHVkZSBTY2hlbWE8L2E+KTxici8+PGJyLz4KLQotWW91ciB1c2Ugb2YgdGhlIFczQy1EZXJpdmVkIFdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlLjxici8+IAotQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSA8YSBocmVmPSJhYm91dF9maWxlcy9XM0NTb2Z0d2FyZUxpY2Vuc2UuaHRtbCI+VzNDU29mdHdhcmVMaWNlbnNlLmh0bWw8L2E+IGFuZCBpcyAKLWFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzE8L2E+LiAKLTwvcD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvYWJvdXRfZmlsZXMvVzNDU29mdHdhcmVMaWNlbnNlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9hYm91dF9maWxlcy9XM0NTb2Z0d2FyZUxpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmZmU1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9hYm91dF9maWxlcy9XM0NTb2Z0d2FyZUxpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci0gIDx0aXRsZT5XM0MgU29mdHdhcmUgTGljZW5zZTwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9TdHlsZVNoZWV0cy9iYXNlLmNzcyIgLz4KLSAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSA8IS0tCi1oMyN2ZXJzaW9uIHsgbWFyZ2luLXRvcDogLTAuOGVtO30gIAotLS0+Ci0KLQotCi0KLQotCi0KLQotCi0gIDwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNGRkZGRkYiPgotPGgxPlczQzxzdXA+rjwvc3VwPiBTT0ZUV0FSRSBOT1RJQ0UgQU5EIExJQ0VOU0U8L2gxPgotCi08aDMgaWQ9InZlcnNpb24iPjxhCi1ocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxPC9hPjwvaDM+Ci0KLTxwPlRoaXMgd29yayAoYW5kIGluY2x1ZGVkIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uIHN1Y2ggYXMgUkVBRE1Fcywgb3Igb3RoZXIKLXJlbGF0ZWQgaXRlbXMpIGlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUgZm9sbG93aW5nCi1saWNlbnNlLiBCeSBvYnRhaW5pbmcsIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91ICh0aGUgbGljZW5zZWUpCi1hZ3JlZSB0aGF0IHlvdSBoYXZlIHJlYWQsIHVuZGVyc3Rvb2QsIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcKLXRlcm1zIGFuZCBjb25kaXRpb25zLjwvcD4KLQotPHA+UGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotZG9jdW1lbnRhdGlvbiwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwmbmJzcDtmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKLWZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24KLUFMTCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZwotbW9kaWZpY2F0aW9uczo8L3A+Ci08b2w+Ci0gIDxsaT5UaGUgZnVsbCB0ZXh0IG9mIHRoaXMgTk9USUNFIGluIGEgbG9jYXRpb24gdmlld2FibGUgdG8gdXNlcnMgb2YgdGhlCi0gICAgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIHdvcmsuPC9saT4KLSAgPGxpPkFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcwotICAgIGFuZCBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCB0aGUgPGEKLSAgICBocmVmPSJjb3B5cmlnaHQtc29mdHdhcmUtc2hvcnQtbm90aWNlLTIwMDIxMjMxLmh0bWwiPlczQyBTb2Z0d2FyZSBTaG9ydAotICAgIE5vdGljZTwvYT4gc2hvdWxkIGJlIGluY2x1ZGVkIChoeXBlcnRleHQgaXMgcHJlZmVycmVkLCB0ZXh0IGlzIHBlcm1pdHRlZCkKLSAgICB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlLjwvbGk+Ci0gIDxsaT5Ob3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZQotICAgIGNoYW5nZXMgd2VyZSBtYWRlLiAoV2UgcmVjb21tZW5kIHlvdSBwcm92aWRlIFVSSXMgdG8gdGhlIGxvY2F0aW9uIGZyb20KLSAgICB3aGljaCB0aGUgY29kZSBpcyBkZXJpdmVkLik8L2xpPgotPC9vbD4KLQotPHA+VEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQgQ09QWVJJR0hUIEhPTERFUlMKLU1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSCi1QVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTiBXSUxMIE5PVCBJTkZSSU5HRQotQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLjwvcD4KLQotPHA+Q09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SCi1ET0NVTUVOVEFUSU9OLjwvcD4KLQotPHA+VGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgY29weXJpZ2h0IGhvbGRlcnMgbWF5IE5PVCBiZSB1c2VkIGluCi1hZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbgotcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkCi1kb2N1bWVudGF0aW9uIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbiB3aXRoIGNvcHlyaWdodCBob2xkZXJzLjwvcD4KLQotPHA+PC9wPgotCi08cD5fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188L3A+Ci0KLTxwPlRoaXMgZm9ybXVsYXRpb24gb2YgVzNDJ3Mgbm90aWNlIGFuZCBsaWNlbnNlIGJlY2FtZSBhY3RpdmUgb24gRGVjZW1iZXIgMzEKLTIwMDIuIFRoaXMgdmVyc2lvbiByZW1vdmVzIHRoZSBjb3B5cmlnaHQgb3duZXJzaGlwIG5vdGljZSBzdWNoIHRoYXQgdGhpcwotbGljZW5zZSBjYW4gYmUgdXNlZCB3aXRoIG1hdGVyaWFscyBvdGhlciB0aGFuIHRob3NlIG93bmVkIGJ5IHRoZSBXM0MsCi1yZWZsZWN0cyB0aGF0IEVSQ0lNIGlzIG5vdyBhIGhvc3Qgb2YgdGhlIFczQywgaW5jbHVkZXMgcmVmZXJlbmNlcyB0byB0aGlzCi1zcGVjaWZpYyBkYXRlZCB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlLCBhbmQgcmVtb3ZlcyB0aGUgYW1iaWd1b3VzIGdyYW50IG9mCi0idXNlIi4gT3RoZXJ3aXNlLCB0aGlzIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIDxhCi1ocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMCI+cHJldmlvdXMKLXZlcnNpb248L2E+IGFuZCBpcyB3cml0dGVuIHNvIGFzIHRvIHByZXNlcnZlIHRoZSA8YQotaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvbGljZW5zZS1saXN0Lmh0bWwjR1BMQ29tcGF0aWJsZUxpY2Vuc2VzIj5GcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uJ3MgYXNzZXNzbWVudCBvZiBHUEwgY29tcGF0aWJpbGl0eTwvYT4gYW5kIDxhCi1ocmVmPSJodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL1czQy5waHAiPk9TSSdzIGNlcnRpZmljYXRpb248L2E+Ci11bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9kb2NzL2RlZmluaXRpb24ucGhwIj5PcGVuIFNvdXJjZQotRGVmaW5pdGlvbjwvYT4uIFBsZWFzZSBzZWUgb3VyIDxhCi1ocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEiPkNvcHlyaWdodCBGQVE8L2E+IGZvcgotY29tbW9uIHF1ZXN0aW9ucyBhYm91dCB1c2luZyBtYXRlcmlhbHMgZnJvbSBvdXIgc2l0ZSwgaW5jbHVkaW5nIHNwZWNpZmljCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgcGFja2FnZXMgbGlrZSBsaWJ3d3csIEFtYXlhLCBhbmQgSmlnc2F3LiBPdGhlcgotcXVlc3Rpb25zIGFib3V0IHRoaXMgbm90aWNlIGNhbiBiZSBkaXJlY3RlZCB0byA8YQotaHJlZj0ibWFpbHRvOnNpdGUtcG9saWN5QHczLm9yZyI+c2l0ZS1wb2xpY3lAdzMub3JnPC9hPi48YnIgLz4KLSZuYnNwOzwvcD4KLTxhZGRyZXNzPgotICBKb3NlcGggUmVhZ2xlICZsdDs8YQotICBocmVmPSJtYWlsdG86c2l0ZS1wb2xpY3lAdzMub3JnIj5zaXRlLXBvbGljeUB3My5vcmcmZ3Q7PC9hPgotPC9hZGRyZXNzPgotCi08cD5MYXN0IHJldmlzZWQgJElkOiBXM0NTb2Z0d2FyZUxpY2Vuc2UuaHRtbCx2IDEuMSAyMDA4LzA4LzAyIDEzOjAzOjExIGRzYXRjaHdlbCBFeHAgJDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzNiNDJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmNfc3NlLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHhzbHQtc2NoZW1hcy8sXAotICAgICAgICAgICAgICAgbGliLyxcCi0gICAgICAgICAgICAgICBiaW4vLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9saWIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM2ZGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2xpYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1hbnRsci1ydW50aW1lLTMuMC4xLmphcgotY29tbW9ucy1qeHBhdGgtMS4yLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvbGliL3hpbmNsdWRlLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL2xpYi94aW5jbHVkZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzIwM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvbGliL3hpbmNsdWRlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NjU1NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUKLUJ1bmRsZS1OYW1lLjAgPSBYU0wgQ29yZSAoSW5jdWJhdGluZykKLUJ1bmRsZS1WZW5kb3IuMCA9RWNsaXBzZS5vcmcKLVhTTC5Db250ZW50VHlwZS5OYW1lPVhTTCBUZW1wbGF0ZQotRElUQV9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1ESVRBCi1Eb2Nib29rX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPURvY2Jvb2sKLVhTTC5WYWxpZGF0b3IuTmFtZT1YU0wgVmFsaWRhdG9yCi1YU0wuVmFsaWRhdG9yRGVsZWdhdGUuTmFtZT1YU0wgVmFsaWRhdG9yIGRlbAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotcGx1Z2luTmFtZSA9IFhTTCBDb3JlIChJbmN1YmF0aW5nKQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhjMGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLQk8IS0tIFRlYW0gcHJvdmlkZXIgaW5mbyAtLT4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzIHR5cGU9InRleHQiIGV4dGVuc2lvbj0ieHNsIiAvPgotCQk8ZmlsZVR5cGVzIHR5cGU9InRleHQiIGV4dGVuc2lvbj0ieHNsdCIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8IS0tIGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4c2wseHNsdCIKLQkJCXByaW9yaXR5PSJub3JtYWwiCi0JCQluYW1lPSIlWFNMLkNvbnRlbnRUeXBlLk5hbWUiCi0JCQlpZD0ieHNsc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgkJCQotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5YTUxSb290RWxlbWVudENvbnRlbnREZXNjcmliZXIiPgotCQkJCTxwYXJhbWV0ZXIgbmFtZT0iZWxlbWVudCIgdmFsdWU9InN0eWxlc2hlZXQiLz4KLQkJCTwvZGVzY3JpYmVyPgotCQk8L2NvbnRlbnQtdHlwZSAtLT4KLSAgPGNvbnRlbnQtdHlwZQotICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgIGZpbGUtZXh0ZW5zaW9ucz0iZGl0YSxkaXRhbWFwIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmNvbnRlbnQtdHlwZS5kaXRhc291cmNlIgotICAgICAgICBuYW1lPSIlRElUQV9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLSAgICAgICAgcHJpb3JpdHk9ImhpZ2giPgotICA8L2NvbnRlbnQtdHlwZT4KLSAgPGNvbnRlbnQtdHlwZQotICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgIGZpbGUtZXh0ZW5zaW9ucz0iZGJrIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmNvbnRlbnQtdHlwZS5kb2Nib29rc291cmNlIgotICAgICAgICBuYW1lPSIlRG9jYm9va19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLSAgICAgICAgcHJpb3JpdHk9ImhpZ2giPgotICA8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFRoZSBtYWdpYyB3aGljaCBkZXRlY3RzIFhTTFQgMS4wIG9yIDIuMCBzdHlsZXNoZWV0cyBhbmQgc3VwcGxpZXMgdGhlIGNvcnJlY3QgWFNEIC0tPgkKLSAJPGV4dGVuc2lvbgotICAgICAgIAlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgIAk8cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlci5SZXNvbHZlckV4dGVuc2lvbiIKLSAgICAgICAgCSAgc3RhZ2U9InByZW5vcm1hbGl6YXRpb24iPgotICAgIAk8L3Jlc29sdmVyRXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJvYmxlbSIKLSAgICAgICAgIG5hbWU9IlhTTCBQcm9ibGVtIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50VGFza3MiPgotICAgICAgPGFudFRhc2sKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuYW50LlhJbmNsdWRlVGFzayIKLSAgICAgICAgICAgIGhlYWRsZXNzPSJ0cnVlIgotICAgICAgICAgICAgbGlicmFyeT0ibGliL3hpbmNsdWRlLmphciIKLSAgICAgICAgICAgIG5hbWU9InhzbC54aW5jbHVkZSI+Ci0gICAgICA8L2FudFRhc2s+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDwhLS0gRXh0cmEgQ2xhc3NwYXRoIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmV4dHJhQ2xhc3NwYXRoRW50cmllcyI+Ci0gICAgICA8ZXh0cmFDbGFzc3BhdGhFbnRyeQotICAgICAgICAgICAgbGlicmFyeT0ibGliL3hpbmNsdWRlLmphciI+Ci0gICAgICA8L2V4dHJhQ2xhc3NwYXRoRW50cnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBpZD0ieHNsIiBuYW1lPSIlWFNMLlZhbGlkYXRvci5OYW1lIiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiPgotICAgICAgPHZhbGlkYXRvcgotICAgICAgICAgICAgYnVpbGQ9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3IiCi0gICAgICAgICAgICBzb3VyY2VpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wiCi0gICAgICAgICAgICBtYW51YWw9InRydWUiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnByb2JsZW0iCi0gICAgICAgICAgICB2ZXJzaW9uPSIyIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ieHNsIi8+Ci0gCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIAotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotIAk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0gICAgICA8bW9kZWxIYW5kbGVyCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yWFNMIgotICAgICAgICAgICAgYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmhhbmRsZXIiPgotICAgICAgPC9tb2RlbEhhbmRsZXI+Ci0gICAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+Ci0gICAgIDxjYXRhbG9nQ29udHJpYnV0aW9uPgotICAgICAgICA8dXJpCi0gICAgICAgICAgICAgIGlkPSJvcmcudzNjLnhpbmNsdWRlIgotICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgICAgICAgICAgICB1cmk9InhzbHQtc2NoZW1hcy94aW5jbHVkZS54c2QiPgotICAgICAgICA8L3VyaT4KLSAgICAgPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KLSAgICAgPC9pbml0aWFsaXplcj4KLSAgPC9leHRlbnNpb24+CQotICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9WYWxpZGF0aW9uUHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvVmFsaWRhdGlvblByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmZiZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9WYWxpZGF0aW9uUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmU7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBjb25zdGFudHMgc3BlY2lmaWMgdG8gdGhlIFhTTCB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblByZWZlcmVuY2VzCi17Ci0JCi0JLyoqCi0JICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9ycyBhbGxvd2VkIHBlciBYU0wgZmlsZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfRVJST1JTID0gIk1BWF9FUlJPUlMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGxldmVsIGF0IHdoaWNoIGEgbWlzc2luZyBwYXJhbWV0ZXIgaXMgcmVwb3J0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1BBUkFNID0gIk1JU1NJTkdfUEFSQU0iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGxldmVsIGF0IHdoaWNoIGFuIGludmFsaWQgWFBhdGggaXMgcmVwb3J0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYUEFUSFMgPSAiQ0hFQ0tfWFBBVEhTIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBsZXZlbCBhdCB3aGljaCBhbiB1bnJlc29sdmVkIGNhbGxlZCB0ZW1wbGF0ZSBpcyByZXBvcnRlZC4gCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMX1RFTVBMQVRFUyA9ICJDSEVDS19DQUxMX1RFTVBMQVRFUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgbGV2ZWwgYXQgd2hpY2ggYSBwYXJhbWV0ZXIgdGhhdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBhbmQgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIGlzIHJlcG9ydGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfUEFSQU0gPSAiRU1QVFlfUEFSQU0iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGxldmVsIGF0IHdoaWNoIGFuIHVucmVzb2x2ZWQgaW1wb3J0IG9yIGluY2x1ZGVkIGlzIHJlcG9ydGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19JTkNMVURFID0gIk1JU1NJTkdfSU5DTFVERSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgbGV2ZWwgYXQgd2hpY2ggYW4gaW5jbHVkZS9pbXBvcnQgY2lyY3VsYXIgcmVmZXJlbmNlcyBpcyByZXBvcnRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUkNVTEFSX1JFRiA9ICJDSVJDVUxBUl9SRUYiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGxldmVsIGF0IHdoaWNoIGEgdGVtcGxhdGUgY29uZmxpY3QgaXMgcmVwb3J0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb25lIG9mIDxjb2RlPklNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgSU1hcmtlci5TRVZFUklUWV9JTkZPPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9DT05GTElDVCA9ICJURU1QTEFURV9DT05GTElDVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgbGV2ZWwgYXQgd2hpY2ggYSBwYXJhbWV0ZXIgd2l0aG91dCBhIG5hbWUgYXR0cmlidXRlIGlzIHJlcG9ydGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEVfTUlTU0lORyA9ICJOQU1FX0FUVFJJQlVURV9NSVNTSU5HIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBsZXZlbCBhdCB3aGljaCBhIHBhcmFtZXRlciB3aXRoIGFuIGVtcHR5IG5hbWUgYXR0cmlidXRlIGlzIHJlcG9ydGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9uZSBvZiA8Y29kZT5JTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTzwvY29kZT4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEVfRU1QVFkgPSAiTkFNRV9BVFRSSUJVVEVfRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGxldmVsIGF0IHdoaWNoIGEgZHVwbGljYXRlIHBhcmFtZXRlciBpcyByZXBvcnRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvbmUgb2YgPGNvZGU+SU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk88L2NvZGU+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVUExJQ0FURV9QQVJBTUVURVIgPSAiRFVQTElDQVRFX1BBUkFNRVRFUiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvWFNMQ29yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9YU0xDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDdiY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9YU0xDb3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5TdHlsZXNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5TdHlsZXNoZWV0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuU3R5bGVzaGVldE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsLkZpbGVVdGlsOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgdG8gYWxsIGFzcGVjdHMgb2YgdGhlIFhTTCBjb3JlIGZ1bmN0aW9uYWxpdHkuCi0gKiA8cD4KLSAqIFRoaXMgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIGFuZCBtYWludGFpbmluZyB0aGUgY2FjaGUgb2YgYnVpbHQgWFNMIG1vZGVscy4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgWFNMQ29yZQotewotCS8qKgotCSAqIFRoZSBYU0wgbmFtZXNwYWNlIFVSSSAoPSBodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBYU0wgY29udGVudCB0eXBlICg9IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIFhTTENvcmUgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBNYXA8SUZpbGUsIFN0eWxlc2hlZXRNb2RlbD4gc3R5bGVzaGVldHNDb21wb3NlZCA9IG5ldyBIYXNoTWFwPElGaWxlLCBTdHlsZXNoZWV0TW9kZWw+KCk7Ci0KLQlwcml2YXRlIFhTTENvcmUoKQotCXt9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNhY2hlZCBzdHlsZXNoZWV0LCBvciBidWlsZCBpdCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGJ1aWx0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBzb3VyY2UgZmlsZSwgb3IgbnVsbCBpZiBjb3VsZCBub3QgYmUgYnVpbHQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0eWxlc2hlZXRNb2RlbCBnZXRTdHlsZXNoZWV0KElGaWxlIGZpbGUpCi0JewotCQlTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldCA9IHN0eWxlc2hlZXRzQ29tcG9zZWQuZ2V0KGZpbGUpOwotCQlpZiAoc3R5bGVzaGVldCA9PSBudWxsKQotCQkJc3R5bGVzaGVldCA9IGJ1aWxkU3R5bGVzaGVldChmaWxlKTsKLQkJcmV0dXJuIHN0eWxlc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcGxldGVseSByZWJ1aWxkIHRoZSBzb3VyY2UgZmlsZSBmcm9tIGl0cyBET00KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gdGhlIHN0eWxlc2hlZXQgbW9kZWwsIG9yIG51bGwgaWYgaXQgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHlsZXNoZWV0TW9kZWwgYnVpbGRTdHlsZXNoZWV0KElGaWxlIGZpbGUpCi0JewotCQlTdHlsZXNoZWV0IHN0eWxlc2hlZXQgPSBTdHlsZXNoZWV0QnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldFN0eWxlc2hlZXQoZmlsZSwgdHJ1ZSk7Ci0JCWlmIChzdHlsZXNoZWV0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3R5bGVzaGVldE1vZGVsIHN0eWxlc2hlZXRDb21wb3NlZCA9IG5ldyBTdHlsZXNoZWV0TW9kZWwoc3R5bGVzaGVldCk7CQkJCi0JCXN0eWxlc2hlZXRzQ29tcG9zZWQucHV0KGZpbGUsIHN0eWxlc2hlZXRDb21wb3NlZCk7Ci0JCXN0eWxlc2hlZXRDb21wb3NlZC5maXgoKTsKLQkJcmV0dXJuIHN0eWxlc2hlZXRDb21wb3NlZDsKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYW4gYWxsIG9mIHRoZSBzdHlsZXNoZWV0cyBmcm9tIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIGJlIGNsZWFuZWQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IgdG8gdHJhY2sgdGhlIGNsZWFuIHByb2dyZXNzCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQl7Ci0JCWZvciAoSXRlcmF0b3I8U3R5bGVzaGVldE1vZGVsPiBpdGVyID0gc3R5bGVzaGVldHNDb21wb3NlZC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCVN0eWxlc2hlZXRNb2RlbCBtb2RlbCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCBwcm9qZWN0LmVxdWFscyhtb2RlbC5nZXRTdHlsZXNoZWV0KCkuZ2V0RmlsZSgpLmdldFByb2plY3QoKSkpCi0JCQl7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2luZ2xldG9uIDxjb2RlPlhTTENvcmU8L2NvZGU+IGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIDxjb2RlPlhTTENvcmU8L2NvZGU+IGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgWFNMQ29yZSBnZXRJbnN0YW5jZSgpCi0JewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFhTTENvcmUoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZXMgYSBmaWxlIGZvciB0aGUgZ2l2ZW4gY3VycmVudCBmaWxlIGFuZCBVUkkuCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnRGaWxlIHRoZSBmaWxlIHRvIHJlc29sdmUgcmVsYXRpdmUgdG8KLQkgKiBAcGFyYW0gdXJpIHRoZSByZWxhdGl2ZSBVUkkgCi0JICogQHJldHVybiB0aGUgZmlsZSBhdCB0aGUgVVJJIHJlbGF0aXZlIHRvIHRoaXMgPGNvZGU+Y3VycmVudEZpbGU8L2NvZGU+Ci0JICovCi0JLy8gVE9ETyBkZXBlbmRzIG9uIGhvdyB3ZSByZXNvbHZlIFVSSXMJCQotCXB1YmxpYyBzdGF0aWMgSUZpbGUgcmVzb2x2ZUZpbGUoSUZpbGUgY3VycmVudEZpbGUsIFN0cmluZyB1cmkpCi0JewotCQlpZiAodXJpID09IG51bGwgfHwgdXJpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGN1cnJlbnRGaWxlLmdldFBhcmVudCgpLmZpbmRNZW1iZXIobmV3IFBhdGgodXJpKSk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybiBudWxsOwkJCi0JCXJldHVybiAoSUZpbGUpcmVzb3VyY2U7Ci0JfQotCS8qKgotCSAqIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIGlzIGFuIFhNTCBmaWxlIGJ5IGluc3BlY3RpbmcgaXRzIGNvbnRlbnQgdHlwZXMuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gaW5zcGVjdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGZpbGUgaXMgYW4gWE1MIGZpbGUKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hNTEZpbGUoSUZpbGUgZmlsZSkKLQl7Ci0JCXJldHVybiBGaWxlVXRpbC5pc1hNTEZpbGUoZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgaXMgYW4gWFNMIGZpbGUgYnkgaW5zcGVjdGluZyBpdHMgY29udGVudCB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBpbnNwZWN0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgZmlsZSBpcyBhbiBYU0wgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hTTEZpbGUoSUZpbGUgZmlsZSkKLQl7Ci0JCXJldHVybiBGaWxlVXRpbC5pc1hTTEZpbGUoZmlsZSk7Ci0JfQotCQotCQotCS8qKgotCSAqIFRha2VzIGEgZ2l2ZW4gPGNvZGU+SURPTU5vZGU8L2NvZGU+IGFuZCByZXR1cm5zIHdoZXRoZXIgaXQgCi0JICogaXMgcGFydCBvZiB0aGUgdGhlIFhTTFQgTmFtZXNwYWNlLgotCSAqIEBwYXJhbSBub2RlICBUaGUgSURPTU5vZGUgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgcGFydCBvZiB0aGUgWFNMVCBuYW1lc3BhY2UsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYU0xOYW1lc3BhY2UoSURPTU5vZGUgbm9kZSkgewotCQlpZiAoaGFzTmFtZXNwYWNlKG5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFhTTF9OQU1FU1BBQ0VfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhlIE5vZGUgdGhhdCB3YXMgcGFzc2VkIGhhcyBhIE5hbWVzcGFjZS4gIElmIGl0Ci0JICogZG9lc24ndCB0aGUgbm9kZSBpcyBlaXRoZXIgZ29pbmcgdG8gYmUgZmFsc2UsIG9yIHRoZSBjYWxsIHRvIHRoZQotCSAqIGdldE5hbWVzcGFjZSgpIG1ldGhvZCB3aWxsIHJldHVybiBudWxsLgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTmFtZXNwYWNlKElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5vZGUgPT0gbnVsbCB8fCBub2RlLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzZlN2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogSmVzcGVyIFN0ZWVuIE3vv71sbGVyIC0gYWRhcHRlZCBmcm9tIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29udGVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBKZXNwZXIgU3RlZW4KLSAqCi0gKi8KLS8vIFJ1bnRpbWUgcGx1Z2luIG1lc3NhZ2UgY2F0YWxvZwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JLy8gQ29udGVudCB0eXBlIG1hbmFnZXIKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xDb3JlUGx1Z2luX3BhcnNlckNvbmZpZ3VyYXRpb247Ci0KLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YURvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTENvcmVQbHVnaW5fYmFkSW5pdGlhbGl6YXRpb25EYXRhOwotCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xDb3JlUGx1Z2luX2NvcmVFcnJvcjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlyZWxvYWRNZXNzYWdlcygpOwotCX0KLQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbG9hZE1lc3NhZ2VzKCkgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvWFNMQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9YU0xDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZThhMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9YU0xDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBKZXNwZXIgU3RlZW4gTe+/vWxsZXIgYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBKZXNwZXIgU3RlZW4gTe+/vWxsZXIgLSBYU0wgY29yZSBwbHVnaW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgWFNMQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgWFNMQ29yZVBsdWdpbiBwbHVnaW47Ci0JCi0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBwYXJzZXJUcmFja2VyID0gbnVsbDsKLQotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFhTTENvcmVQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJYnVuZGxlQ29udGV4dCA9IGNvbnRleHQ7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNMQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lzdGVyZWQgU0FYIHBhcnNlciBmYWN0b3J5IG9yIG51bGwgaWYgb25lCi0JICogZG9lcyBub3QgZXhpc3QuCSAqIEByZXR1cm4KLQkgKiBAcmV0dXJuIHJldHVybnMgYSBTQVhQYXJzZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFNBWFBhcnNlckZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJaWYgKHBhcnNlclRyYWNrZXIgPT0gbnVsbCkgewotCQkJcGFyc2VyVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihidW5kbGVDb250ZXh0LCBTQVhQYXJzZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCQlwYXJzZXJUcmFja2VyLm9wZW4oKTsKLQkJfQotCQlTQVhQYXJzZXJGYWN0b3J5IHRoZUZhY3RvcnkgPSAoU0FYUGFyc2VyRmFjdG9yeSkgcGFyc2VyVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCWlmICh0aGVGYWN0b3J5ICE9IG51bGwpCi0JCQl0aGVGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQlyZXR1cm4gdGhlRmFjdG9yeTsKLQl9Ci0JCi0JLyoqCi0JICogTG9ncyB0aGUgc3BlY2lmaWVkIHN0YXR1cyB3aXRoIHRoaXMgcGx1Zy1pbidzIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyB0byBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlIHRocm93YWJsZSB0byBsb2cgCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCWxvZygoKENvcmVFeGNlcHRpb24pZSkuZ2V0U3RhdHVzKCkpOwotCQl9IGVsc2UgewotCQkJbG9nKG5ld0Vycm9yU3RhdHVzKE1lc3NhZ2VzLlhTTENvcmVQbHVnaW5fY29yZUVycm9yLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBlcnJvciBzdGF0dXMgZm9yIHRoaXMgcGx1Zy1pbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHN0YXR1cwotCSAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGV4Y2VwdGlvbiB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc3RhdHVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcmV0dXJuIGEgbmV3IGVycm9yIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBuZXdFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9hbnQvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvYW50L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODBmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9hbnQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLmFudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIFhJbmNsdWRlIG1lc3NhZ2UgcHJvcGVydGllcyBmb3Igc3RyaW5nIGV4dGVybmFsaXphdGlvbgotICogQGF1dGhvciBkY2FydmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuYW50Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWEluY2x1ZGVUYXNrXzA7Ci0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYSW5jbHVkZVRhc2tfMTsKLQkKLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YURvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhJbmNsdWRlVGFza18yOwotCQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWEluY2x1ZGVUYXNrXzM7Ci0JCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYSW5jbHVkZVRhc2tfNDsKLQkKLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YURvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhJbmNsdWRlVGFza181OwotCQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWEluY2x1ZGVUYXNrXzY7Ci0JCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFEb2MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYSW5jbHVkZVRhc2tfNzsKLQkKLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YURvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhJbmNsdWRlVGFza184OwotCQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhRG9jCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWEluY2x1ZGVUYXNrXzk7Ci0JCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9hbnQvWEluY2x1ZGVUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL2FudC9YSW5jbHVkZVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmMzNiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL2FudC9YSW5jbHVkZVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBDb3B5cmlnaHQgKGMpIDIwMDggTGFycyBWb2dlbCANCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsdjEwLmh0bWwNCi0qDQotKiBDb250cmlidXRvcnM6DQotKiBMYXJzIFZvZ2VsIC0gTGFycy5Wb2dlbEBnbWFpbC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLmFudDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC54aW5jbHVkZS5YSW5jbHVkZXI7DQotDQotLyoqDQotICogVE9ETzogQWRkIEphdmEgRG9jDQotICogQGF1dGhvciBMYXJzIFZvZ2VsDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgWEluY2x1ZGVUYXNrIGV4dGVuZHMgVGFzayB7DQotCXByaXZhdGUgU3RyaW5nIGluRmlsZTsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgb3V0RmlsZTsNCi0NCi0JLyoqDQotCSAqIFRPRE86IEFkZCBKYXZhRG9jIA0KLQkgKiBAcGFyYW0gaW5GaWxlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbihTdHJpbmcgaW5GaWxlKSB7DQotCQlsb2coTWVzc2FnZXMuWEluY2x1ZGVUYXNrXzAgKyBpbkZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KLQkJdGhpcy5pbkZpbGUgPSBpbkZpbGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRPRE86IEFkZCBKYXZhRG9jDQotCSAqIEBwYXJhbSBvdXRGaWxlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRPdXQoU3RyaW5nIG91dEZpbGUpIHsNCi0JCWxvZyhNZXNzYWdlcy5YSW5jbHVkZVRhc2tfMSArIG91dEZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KLQkJdGhpcy5vdXRGaWxlID0gb3V0RmlsZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgew0KLQkJdmFsaWRhdGUoKTsNCi0JCWxvZyhNZXNzYWdlcy5YSW5jbHVkZVRhc2tfMiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7DQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShpbkZpbGUpOw0KLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7DQotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE1lc3NhZ2VzLlhJbmNsdWRlVGFza18zDQotCQkJCQkrIGluRmlsZSk7DQotCQl9DQotCQkvLyBXZSB3aWxsIGNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cywgaWYgbm90IHdlIHdpbGwgdHJ5IHRvIGNyZWF0ZSB0aGUNCi0JCS8vIG91dHB1dCBmaWxlIGFuZCBvciB0aGUgb3V0cHV0IGRpcmVjdG9yeQ0KLQkJRmlsZSBmaWxlb3V0ID0gbmV3IEZpbGUob3V0RmlsZSk7DQotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGZpbGVvdXQuZ2V0UGFyZW50KCkpOw0KLQkJaWYgKCFkaXIuZXhpc3RzKCkpIHsNCi0JCQlsb2coTWVzc2FnZXMuWEluY2x1ZGVUYXNrXzQgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLQ0KLQkJCUJvb2xlYW4gc3VjY2VzcyA9IChuZXcgRmlsZShkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKS5ta2RpcnMoKTsNCi0JCQlpZiAoIXN1Y2Nlc3MpIHsNCi0JCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE1lc3NhZ2VzLlhJbmNsdWRlVGFza181DQotCQkJCQkJKyBvdXRGaWxlKTsNCi0JCQl9DQotCQl9DQotCQkvLyBjaGVjayBpZiB0aGUgaW5jbHVkZWQgZmlsZXMgYXJlIG1vZGlmaWVkIGFmdGVyIHRoZSBsYXN0IHJ1bg0KLQkJLy8gQXNzdW1wdGlvbiB0aGF0IGFsbCB0aGUgaW5jbHVkZWQgZmlsZXMgYXJlIHBhcnQgb2YgdGhlIGlucHV0IGZpbGUNCi0JCS8vIGRpcmVjdG9yeQ0KLQkJaWYgKGNoZWNrbW9kaWZpZWQoaW5GaWxlLCBvdXRGaWxlKSkgew0KLQkJCWxvZyhNZXNzYWdlcy5YSW5jbHVkZVRhc2tfNiwNCi0JCQkJCVByb2plY3QuTVNHX0lORk8pOw0KLQkJCVhJbmNsdWRlciBsYSA9IG5ldyBYSW5jbHVkZXIoKTsNCi0JCQl0cnkgew0KLQkJCQlsYS5leHRyYWN0WE1MRmlsZShpbkZpbGUsIG91dEZpbGUpOw0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihNZXNzYWdlcy5YSW5jbHVkZVRhc2tfNw0KLQkJCQkJCSsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2ttb2RpZmllZChTdHJpbmcgaW5GaWxlLCBTdHJpbmcgb3V0RmlsZSkgew0KLQkJRmlsZSBpbiA9IG5ldyBGaWxlKGluRmlsZSk7DQotCQlGaWxlIG91dCA9IG5ldyBGaWxlKG91dEZpbGUpOw0KLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShpbi5nZXRQYXJlbnQoKSk7DQotDQotCQlDb2xsZWN0aW9uPEZpbGU+IGFsbEZpbGVzID0gbGlzdEZpbGVzKGRpciwgdHJ1ZSk7DQotCQlmb3IgKEZpbGUgZiA6IGFsbEZpbGVzKSB7DQotCQkJaWYgKGYubGFzdE1vZGlmaWVkKCkgPiBvdXQubGFzdE1vZGlmaWVkKCkpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUT0RPOiBBZGQgSmF2YURvYw0KLQkgKiBAcGFyYW0gZGlyZWN0b3J5DQotCSAqIEBwYXJhbSByZWN1cnNlDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBDb2xsZWN0aW9uPEZpbGU+IGxpc3RGaWxlcyhGaWxlIGRpcmVjdG9yeSwgYm9vbGVhbiByZWN1cnNlKSB7DQotCQkvLyBMaXN0IG9mIGZpbGVzIC8gZGlyZWN0b3JpZXMNCi0JCVZlY3RvcjxGaWxlPiBmaWxlcyA9IG5ldyBWZWN0b3I8RmlsZT4oKTsNCi0NCi0JCS8vIEdldCBmaWxlcyAvIGRpcmVjdG9yaWVzIGluIHRoZSBkaXJlY3RvcnkNCi0JCUZpbGVbXSBlbnRyaWVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOw0KLQ0KLQkJLy8gR28gb3ZlciBlbnRyaWVzDQotCQlmb3IgKEZpbGUgZW50cnkgOiBlbnRyaWVzKSB7DQotDQotCQkJZmlsZXMuYWRkKGVudHJ5KTsNCi0NCi0JCQkvLyBJZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSBhbmQgdGhlIHJlY3Vyc2UgZmxhZw0KLQkJCS8vIGlzIHNldCwgcmVjdXJzZSBpbnRvIHRoZSBkaXJlY3RvcnkNCi0JCQlpZiAocmVjdXJzZSAmJiBlbnRyeS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCWZpbGVzLmFkZEFsbChsaXN0RmlsZXMoZW50cnksIHJlY3Vyc2UpKTsNCi0JCQl9DQotCQl9DQotDQotCQkvLyBSZXR1cm4gY29sbGVjdGlvbiBvZiBmaWxlcw0KLQkJcmV0dXJuIGZpbGVzOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsNCi0JCWlmIChpbkZpbGUgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihNZXNzYWdlcy5YSW5jbHVkZVRhc2tfOCk7DQotCQl9DQotCQlpZiAob3V0RmlsZSA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE1lc3NhZ2VzLlhJbmNsdWRlVGFza185KTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL2FudC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9hbnQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2YWQ5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL2FudC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotWEluY2x1ZGVUYXNrXzA9U2V0dGluZyB0aGUgb3V0cHV0IEZpbGUgdG86IAotWEluY2x1ZGVUYXNrXzE9U2V0dGluZyB0aGUgb3V0cHV0IEZpbGUgdG86IAotWEluY2x1ZGVUYXNrXzI9RXhlY3V0aW5nIHRoZSBYSW5jbHVkZVRhc2sKLVhJbmNsdWRlVGFza18zPVNwZWNpZmllZCBJbnB1dGZpbGUgZG9lcyBub3QgZXhpc3RzIAotWEluY2x1ZGVUYXNrXzQ9Q3JlYXRpbmcgdGhlIG91dHB1dCBkaXJlY3RvcnkgCi1YSW5jbHVkZVRhc2tfNT1Db3VsZCBub3QgY3JlYXRlIG91dHB1dGZpbGUKLVhJbmNsdWRlVGFza182PUNoYW5nZXMgZGV0ZWN0ZWQuIENyZWF0aW5nIGEgbmV3IG91dHB1dCBmaWxlCi1YSW5jbHVkZVRhc2tfNz1Qcm9ibGVtcyB3aXRoIGFjY2Vzc2luZyB0aGUgZmlsZXMuCi1YSW5jbHVkZVRhc2tfOD1QbGVhc2Ugc3BlY2lmeSBpbnB1dGZpbGUgCi1YSW5jbHVkZVRhc2tfOT1QbGVhc2Ugc3BlY2lmeSBvdXRwdXRmaWxlIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzExOTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0gYWRhcHRlZCBmcm9tIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29udGVudCAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIFJlc29sdmVyIHByb2JsZW1zCi1YU0xDb3JlUGx1Z2luX2JhZEluaXRpYWxpemF0aW9uRGF0YSA9IEludmFsaWQgaW5pdGlhbGl6YXRpb24gZGF0YSBmb3IgInswfSIuCi1YU0xDb3JlUGx1Z2luX3BhcnNlckNvbmZpZ3VyYXRpb24gPSBYU0wgcGFyc2VyIGNvbmZpZ3VyYXRpb24gZXJyb3IgZHVyaW5nIGNvbnRlbnQgZGVzY3JpcHRpb24uCi1YU0xDb3JlUGx1Z2luX2NvcmVFcnJvcj1FcnJvciBsb2dnZWQgZnJvbSBYU0wgY29yZSBwbHVnLWluXDogCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL0NhbGxUZW1wbGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9DYWxsVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlZmRhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL0NhbGxUZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUgPGNvZGU+eHNsOmNhbGwtdGVtcGxhdGU8L2NvZGU+IG1vZGVsIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIENhbGxUZW1wbGF0ZSBleHRlbmRzIFhTTEVsZW1lbnQKLXsKLQlmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIENhbGxUZW1wbGF0ZShTdHlsZXNoZWV0IHN0eWxlc2hlZXQpCi0JewotCQlzdXBlcihzdHlsZXNoZWV0KTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGEgcGFyYW1ldGVyIHRvIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKQotCXsKLQkJcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBhdHRyaWJ1dGUgaWYgb25lIGV4aXN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBuYW1lLCBvciBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHBhcmFtZXRlcnMKLQkgKi8KLQlwdWJsaWMgTGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKQotCXsKLQkJcmV0dXJuIHBhcmFtZXRlcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9JbXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMTVmZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9JbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotLyoqCi0gKiBUaGUgPGNvZGU+eHNsOmltcG9ydDwvY29kZT4gbW9kZWwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0IGV4dGVuZHMgSW5jbHVkZQotewotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIEltcG9ydChTdHlsZXNoZWV0IHN0eWxlc2hlZXQpCi0JewotCQlzdXBlcihzdHlsZXNoZWV0LElNUE9SVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9JbmNsdWRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL0luY2x1ZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0ZjJmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL0luY2x1ZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotCi0vKioKLSAqIFRoZSA8Y29kZT54c2w6aW5jbHVkZTwvY29kZT4gbW9kZWwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgSW5jbHVkZSBleHRlbmRzIFhTTEVsZW1lbnQKLXsKLQkvKioKLQkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpcyBhbiA8Y29kZT5JbmNsdWRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFID0gMTsKLQkKLQkvKioKLQkgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpcyBhbiA8Y29kZT5JbXBvcnQ8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9SVCA9IDI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVzaGVldCB0aGUgc3R5bGVzaGVldCB0aGF0IHRoaXMgYmVsb25ncyB0bwotCSAqLwotCXB1YmxpYyBJbmNsdWRlKFN0eWxlc2hlZXQgc3R5bGVzaGVldCkKLQl7Ci0JCXRoaXMoc3R5bGVzaGVldCxJTkNMVURFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcywgc3BlY2lmeWluZyB3aGV0aGVyIGFuIDxjb2RlPkluY2x1ZGU8L2NvZGU+IG9yIGFuIDxjb2RlPkltcG9ydDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHN0eWxlc2hlZXQgdGhlIHN0eWxlc2hlZXQgdGhhdCB0aGlzIGJlbG9uZ3MgdG8KLQkgKiBAcGFyYW0gdHlwZSBvbmUgb2YgdGhlIGNvbnN0YW50cyA8Y29kZT5JTkNMVURFPC9jb2RlPiBvciA8Y29kZT5JTVBPUlQ8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIEluY2x1ZGUoU3R5bGVzaGVldCBzdHlsZXNoZWV0LCBpbnQgdHlwZSkKLQl7Ci0JCXN1cGVyKHN0eWxlc2hlZXQpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHR5cGUgb2YgaW5jbHVkZSwgd2hldGhlciBhbiA8Y29kZT5JbmNsdWRlPC9jb2RlPiBvciBhbiA8Y29kZT5JbXBvcnQ8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBjb25zdGFudHMgPGNvZGU+SU5DTFVERTwvY29kZT4gb3IgPGNvZGU+SU1QT1JUPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5jbHVkZVR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmhyZWY8L2NvZGU+IGF0dHJpYnV0ZSBpZiBvbmUgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIDxjb2RlPmhyZWY8L2NvZGU+IHZhbHVlLCBvciBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImhyZWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQotCS8qKgotCSAqIEdldHMgdGhlIGluY2x1ZGVkIGZpbGUgYXMgYSBzb3VyY2UgZmlsZSwgaWYgcG9zc2libGUgKHJldHVybmVkIGZpbGUgbWF5IGJlIG51bGwgYW5kIG5lZWQgbm90IGV4aXN0KS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbmNsdWRlZCBmaWxlLCBvciBudWxsCi0JICovCi0JcHVibGljIElGaWxlIGdldEhyZWZBc0ZpbGUoKQotCXsKLQkJcmV0dXJuIFhTTENvcmUucmVzb2x2ZUZpbGUoZ2V0U3R5bGVzaGVldCgpLmdldEZpbGUoKSwgZ2V0SHJlZigpKTsKLQl9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9QYXJhbWV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMDllMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotLyoqCi0gKiBUaGUgPGNvZGU+eHNsOnBhcmFtZXRlcjwvY29kZT4gb3IgPGNvZGU+eHNsOndpdGgtcGFyYW08L2NvZGU+IG1vZGVsIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtZXRlciBleHRlbmRzIFZhcmlhYmxlCi17Ci0JcHJpdmF0ZSBib29sZWFuIHZhbHVlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHN0eWxlc2hlZXQgdGhlIHN0eWxlc2hlZXQgdGhhdCB0aGlzIGJlbG9uZ3MgdG8KLQkgKi8KLQlwdWJsaWMgUGFyYW1ldGVyKFN0eWxlc2hlZXQgc3R5bGVzaGVldCkKLQl7Ci0JCXN1cGVyKHN0eWxlc2hlZXQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGlzIGhhcyBhIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZVNldCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGhhcyBhIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZVNldCkKLQl7Ci0JCXRoaXMudmFsdWVTZXQgPSB2YWx1ZVNldDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgd2hldGhlciB0aGlzIGhhcyBhIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBoYXMgYSB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsdWUoKQotCXsKLQkJaWYgKHZhbHVlU2V0KQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChnZXRBdHRyaWJ1dGVWYWx1ZSgic2VsZWN0IikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9TdHlsZXNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1N0eWxlc2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhMTJiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1N0eWxlc2hlZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogVGhlIDxjb2RlPnhzbDpzdHlsZXNoZWV0PC9jb2RlPiBtb2RlbCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZXNoZWV0IGV4dGVuZHMgWFNMRWxlbWVudAotewotCWZpbmFsIElGaWxlIGZpbGU7Ci0JZmluYWwgTGlzdDxJbmNsdWRlPiBpbmNsdWRlcyA9IG5ldyBBcnJheUxpc3Q8SW5jbHVkZT4oKTsKLQlmaW5hbCBMaXN0PEltcG9ydD4gaW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8SW1wb3J0PigpOwotCWZpbmFsIExpc3Q8VGVtcGxhdGU+IHRlbXBsYXRlcyA9IG5ldyBBcnJheUxpc3Q8VGVtcGxhdGU+KCk7Ci0JZmluYWwgTGlzdDxDYWxsVGVtcGxhdGU+IGNhbGxlZFRlbXBsYXRlcyA9IG5ldyBBcnJheUxpc3Q8Q2FsbFRlbXBsYXRlPigpOwotCWZpbmFsIExpc3Q8VmFyaWFibGU+IGdsb2JhbFZhcmlhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VmFyaWFibGU+KCk7Ci0JZmluYWwgTGlzdDxYU0xFbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8WFNMRWxlbWVudD4oKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRoYXQgdGhpcyByZXByZXNlbnRzCi0JICovCi0JcHVibGljIFN0eWxlc2hlZXQoSUZpbGUgZmlsZSkKLQl7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3R5bGVzaGVldCBnZXRTdHlsZXNoZWV0KCkKLQl7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiA8Y29kZT5JbmNsdWRlPC9jb2RlPiB0byB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlIHRoZSBpbmNsdWRlIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEluY2x1ZGUoSW5jbHVkZSBpbmNsdWRlKQotCXsKLQkJaW5jbHVkZXMuYWRkKGluY2x1ZGUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiA8Y29kZT5JbXBvcnQ8L2NvZGU+IHRvIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGUgdGhlIGltcG9ydCB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbXBvcnQoSW1wb3J0IGluY2x1ZGUpCi0JewotCQlpbXBvcnRzLmFkZChpbmNsdWRlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSA8Y29kZT5UZW1wbGF0ZTwvY29kZT4gdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGUgdGhlIHRlbXBsYXRlIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRlbXBsYXRlKFRlbXBsYXRlIHRlbXBsYXRlKQotCXsKLQkJdGVtcGxhdGVzLmFkZCh0ZW1wbGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgPGNvZGU+Q2FsbFRlbXBsYXRlPC9jb2RlPiB0byB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZSB0aGUgdGVtcGxhdGUgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2FsbGVkVGVtcGxhdGUoQ2FsbFRlbXBsYXRlIHRlbXBsYXRlKQotCXsKLQkJY2FsbGVkVGVtcGxhdGVzLmFkZCh0ZW1wbGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaWxlIHRoYXQgdGhpcyByZXByZXNlbnRzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpbGUgdGhhdCB0aGlzIHJlcHJlc2VudHMKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0JewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgaW5jbHVkZXMgZm9yIHRoaXMuCi0JICogCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBpbmNsdWRlcwotCSAqLwotCXB1YmxpYyBMaXN0PEluY2x1ZGU+IGdldEluY2x1ZGVzKCkKLQl7Ci0JCXJldHVybiBpbmNsdWRlczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIGltcG9ydHMgZm9yIHRoaXMuCi0JICogCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBpbXBvcnRzCi0JICovCi0JcHVibGljIExpc3Q8SW1wb3J0PiBnZXRJbXBvcnRzKCkKLQl7Ci0JCXJldHVybiBpbXBvcnRzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiB0ZW1wbGF0ZXMgZm9yIHRoaXMuCi0JICogCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgTGlzdDxUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCkKLQl7Ci0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIGNhbGxlZCB0ZW1wbGF0ZXMgZm9yIHRoaXMuCi0JICogCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBjYWxsZWQgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIExpc3Q8Q2FsbFRlbXBsYXRlPiBnZXRDYWxsZWRUZW1wbGF0ZXMoKQotCXsKLQkJcmV0dXJuIGNhbGxlZFRlbXBsYXRlczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBnbG9iYWwgdmFyaWFibGUgdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gdmFyIHRoZSB2YXJpYWJsZSB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRHbG9iYWxWYXJpYWJsZShWYXJpYWJsZSB2YXIpCi0JewotCQlnbG9iYWxWYXJpYWJsZXMuYWRkKHZhcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9TdHlsZXNoZWV0QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9TdHlsZXNoZWV0QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNiMzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvU3R5bGVzaGVldEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5YU0xDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQSBidWlsZGVyIHRoYXQgY3JlYXRlcyBhbmQgbWFpbnRhaW5zIGEgY2FjaGUgb2YgPGNvZGU+U3R5bGVzaGVldDwvY29kZT4ncy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldEJ1aWxkZXIgewotCXByaXZhdGUgc3RhdGljIFN0eWxlc2hlZXRCdWlsZGVyIGluc3RhbmNlOwotCXByaXZhdGUgZmluYWwgTWFwPElGaWxlLCBTdHlsZXNoZWV0PiBidWlsdEZpbGVzID0gbmV3IEhhc2hNYXA8SUZpbGUsIFN0eWxlc2hlZXQ+KCk7Ci0KLQlwcml2YXRlIFN0eWxlc2hlZXRCdWlsZGVyKCkgewotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgPGNvZGU+U3R5bGVzaGVldDwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlLiBJZiBlaXRoZXIKLQkgKiB0aGUgPGNvZGU+U3R5bGVzaGVldDwvY29kZT4gaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkIG9yCi0JICogPGNvZGU+Zm9yY2U8L2NvZGU+IGlzIHNwZWNpZmllZCB0aGVuIHRoZSA8Y29kZT5TdHlsZXNoZWV0PC9jb2RlPiBpcwotCSAqIGJ1aWx0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgWFNMIGZpbGUKLQkgKiBAcGFyYW0gZm9yY2UKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZvcmNlIGEgcGFyc2Ugb2YgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5TdHlsZXNoZWV0PC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHlsZXNoZWV0IGdldFN0eWxlc2hlZXQoSUZpbGUgZmlsZSwgYm9vbGVhbiBmb3JjZSkgewotCQlTdHlsZXNoZWV0IHN0eWxlc2hlZXQgPSBidWlsdEZpbGVzLmdldChmaWxlKTsKLQkJaWYgKHN0eWxlc2hlZXQgPT0gbnVsbCB8fCBmb3JjZSkgewotCQkJc3R5bGVzaGVldCA9IGJ1aWxkKGZpbGUpOwotCQkJYnVpbHRGaWxlcy5wdXQoZmlsZSwgc3R5bGVzaGVldCk7Ci0JCX0KLQkJcmV0dXJuIHN0eWxlc2hlZXQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHlsZXNoZWV0IGJ1aWxkKElGaWxlIGZpbGUpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZiAoRGVidWcuZGVidWdYU0xNb2RlbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZGluZyAiICsgZmlsZSArICIuLi4iKTsKLQkJfQotCi0JCVN0eWxlc2hlZXQgc3R5bGVzaGVldCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc21vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkKLQkJCQkJLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJaWYgKHNtb2RlbCA9PSBudWxsKSB7Ci0JCQkJc21vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKQotCQkJCQkJLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCQlpZiAoRGVidWcuZGVidWdYU0xNb2RlbCkgewotCQkJCQlsb25nIGVuZFBhcnNlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUEFSU0UgIiArIGZpbGUgKyAiIGluICIKLQkJCQkJCQkrIChlbmRQYXJzZSAtIHN0YXJ0KSArICJtcyIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRGVidWcuZGVidWdYU0xNb2RlbCkgewotCQkJCWxvbmcgZW5kUGFyc2UgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5PLVBBUlNFICIgKyBmaWxlICsgIiBpbiAiCi0JCQkJCQkrIChlbmRQYXJzZSAtIHN0YXJ0KSArICJtcyIpOwotCQkJfQotCQkJLy8gc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWlmIChzbW9kZWwgIT0gbnVsbCAmJiBzbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NTW9kZWwgbW9kZWwgPSAoSURPTU1vZGVsKSBzbW9kZWw7Ci0JCQkJc3R5bGVzaGVldCA9IHBhcnNlTW9kZWwobW9kZWwsIGZpbGUpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlYU0xDb3JlUGx1Z2luLmxvZyhlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlYU0xDb3JlUGx1Z2luLmxvZyhlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzbW9kZWwgIT0gbnVsbCkKLQkJCQlzbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnWFNMTW9kZWwpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJVSUxEICIgKyBmaWxlICsgIiBpbiAiICsgKGVuZCAtIHN0YXJ0KSArICJtcyIpOwotCQl9Ci0JCXJldHVybiBzdHlsZXNoZWV0OwotCX0KLQotCXByaXZhdGUgU3R5bGVzaGVldCBwYXJzZU1vZGVsKElET01Nb2RlbCBtb2RlbCwgSUZpbGUgZmlsZSkgewotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlTdHlsZXNoZWV0IHNmID0gbmV3IFN0eWxlc2hlZXQoZmlsZSk7Ci0JCVN0eWxlc2hlZXRQYXJzZXIgd2Fsa2VyID0gbmV3IFN0eWxlc2hlZXRQYXJzZXIoc2YpOwotCQl3YWxrZXIud2Fsa0RvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHNmOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2luZ2xldG9uIDxjb2RlPlN0eWxlc2hlZXRCdWlsZGVyPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5TdHlsZXNoZWV0QnVpbGRlcjwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTdHlsZXNoZWV0QnVpbGRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlc2hlZXRCdWlsZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0eWxlc2hlZXRQYXJzZXIgewotCQlwcml2YXRlIGZpbmFsIFN0eWxlc2hlZXQgc2Y7Ci0JCXByaXZhdGUgZmluYWwgU3RhY2s8RWxlbWVudD4gZWxlbWVudFN0YWNrID0gbmV3IFN0YWNrPEVsZW1lbnQ+KCk7Ci0JCXByaXZhdGUgVGVtcGxhdGUgY3VycmVudFRlbXBsYXRlOwotCQlwcml2YXRlIENhbGxUZW1wbGF0ZSBjdXJyZW50Q2FsbFRlbXBsYXRlOwotCQlwcml2YXRlIFhTTEVsZW1lbnQgcGFyZW50RWw7Ci0KLQkJcHVibGljIFN0eWxlc2hlZXRQYXJzZXIoU3R5bGVzaGVldCBzdHlsZXNoZWV0KSB7Ci0JCQl0aGlzLnNmID0gc3R5bGVzaGVldDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdhbGtEb2N1bWVudChJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQotCQkJaWYgKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpICE9IG51bGwpCi0JCQkJcmVjdXJzZShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVjdXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChYU0xDb3JlLlhTTF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKSkgewotCQkJCVhTTEVsZW1lbnQgeHNsRWw7Ci0JCQkJU3RyaW5nIGVsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKCJzdHlsZXNoZWV0Ii5lcXVhbHMoZWxOYW1lKSAmJiBlbGVtZW50U3RhY2suc2l6ZSgpID09IDApIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCXhzbEVsID0gc2Y7Ci0JCQkJfSBlbHNlIGlmICgiaW5jbHVkZSIuZXF1YWxzKGVsTmFtZSkgJiYgZWxlbWVudFN0YWNrLnNpemUoKSA9PSAxKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlJbmNsdWRlIGluY2x1ZGUgPSBuZXcgSW5jbHVkZShzZik7Ci0JCQkJCXNmLmFkZEluY2x1ZGUoaW5jbHVkZSk7Ci0JCQkJCXhzbEVsID0gaW5jbHVkZTsKLQkJCQl9IGVsc2UgaWYgKCJpbXBvcnQiLmVxdWFscyhlbE5hbWUpICYmIGVsZW1lbnRTdGFjay5zaXplKCkgPT0gMSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJSW1wb3J0IGluY2x1ZGUgPSBuZXcgSW1wb3J0KHNmKTsKLQkJCQkJc2YuYWRkSW1wb3J0KGluY2x1ZGUpOwotCQkJCQl4c2xFbCA9IGluY2x1ZGU7Ci0JCQkJfSBlbHNlIGlmICgidGVtcGxhdGUiLmVxdWFscyhlbE5hbWUpICYmIGVsZW1lbnRTdGFjay5zaXplKCkgPT0gMSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJY3VycmVudFRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHNmKTsKLQkJCQkJc2YuYWRkVGVtcGxhdGUoY3VycmVudFRlbXBsYXRlKTsKLQkJCQkJeHNsRWwgPSBjdXJyZW50VGVtcGxhdGU7Ci0JCQkJfSBlbHNlIGlmICgicGFyYW0iLmVxdWFscyhlbE5hbWUpICYmIGVsZW1lbnRTdGFjay5zaXplKCkgPT0gMiAmJiBjdXJyZW50VGVtcGxhdGUgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJUGFyYW1ldGVyIHBhcmFtID0gbmV3IFBhcmFtZXRlcihzZik7Ci0JCQkJCS8vIGRldGVybWluZSB3aGV0aGVyIHBhcmFtIGhhcyBhIHZhbHVlCi0JCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCU5vZGUgY2hpbGROb2RlID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotCQkJCQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkJCQlwYXJhbS5zZXRWYWx1ZSh0cnVlKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50VGVtcGxhdGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLQkJCQkJeHNsRWwgPSBwYXJhbTsKLQkJCQl9IGVsc2UgaWYgKCJjYWxsLXRlbXBsYXRlIi5lcXVhbHMoZWxOYW1lKSAmJiBlbGVtZW50U3RhY2suc2l6ZSgpID49IDIpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWN1cnJlbnRDYWxsVGVtcGxhdGUgPSBuZXcgQ2FsbFRlbXBsYXRlKHNmKTsKLQkJCQkJc2YuYWRkQ2FsbGVkVGVtcGxhdGUoY3VycmVudENhbGxUZW1wbGF0ZSk7Ci0JCQkJCXhzbEVsID0gY3VycmVudENhbGxUZW1wbGF0ZTsKLQkJCQl9IGVsc2UgaWYgKCJ3aXRoLXBhcmFtIi5lcXVhbHMoZWxOYW1lKSAmJiBlbGVtZW50U3RhY2suc2l6ZSgpID49IDMgJiYgY3VycmVudENhbGxUZW1wbGF0ZSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKHNmKTsKLQkJCQkJLy8gZGV0ZXJtaW5lIHdoZXRoZXIgcGFyYW0gaGFzIGEgdmFsdWUKLQkJCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJTm9kZSBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0JCQkJCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQkJCXBhcmFtLnNldFZhbHVlKHRydWUpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnRDYWxsVGVtcGxhdGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLQkJCQkJeHNsRWwgPSBwYXJhbTsKLQkJCQl9IGVsc2UgaWYgKCJ2YXJpYWJsZSIuZXF1YWxzKGVsTmFtZSkgJiYgZWxlbWVudFN0YWNrLnNpemUoKSA9PSAxKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlWYXJpYWJsZSB2YXIgPSBuZXcgVmFyaWFibGUoc2YpOwotCQkJCQlzZi5hZGRHbG9iYWxWYXJpYWJsZSh2YXIpOwotCQkJCQl4c2xFbCA9IHZhcjsKLQkJCQl9IGVsc2UgewotCQkJCQl4c2xFbCA9IG5ldyBYU0xFbGVtZW50KHNmKTsKLQkJCQl9Ci0JCQkJY29uZmlndXJlKChJRE9NTm9kZSkgZWxlbWVudCwgeHNsRWwpOwotCQkJfQotCQkJZWxlbWVudFN0YWNrLnB1c2goZWxlbWVudCk7Ci0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgbm9kZSA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXJlY3Vyc2UoKEVsZW1lbnQpIG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRTdGFjay5wb3AoKTsKLQkJCS8vIGN1cnJlbnRUZW1wbGF0ZSA9IG51bGw7Ci0JCQkvLyBjdXJyZW50Q2FsbFRlbXBsYXRlID0gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjb25maWd1cmUoSURPTU5vZGUgbm9kZSwgWFNMRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlzZXRQb3NpdGlvbkluZm8obm9kZSwgZWxlbWVudCk7Ci0JCQlOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cikgbWFwLml0ZW0oaSk7Ci0JCQkJWFNMQXR0cmlidXRlIHhzbGF0dCA9IG5ldyBYU0xBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ci5nZXROYW1lKCksCi0JCQkJCQlhdHRyLmdldFZhbHVlKCkpOwotCQkJCXNldFBvc2l0aW9uSW5mbyhhdHRyLCB4c2xhdHQpOwotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKHhzbGF0dCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50RWwgIT0gbnVsbCkKLQkJCQlwYXJlbnRFbC5hZGRDaGlsZChlbGVtZW50KTsKLQkJCXBhcmVudEVsID0gZWxlbWVudDsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0UG9zaXRpb25JbmZvKElET01Ob2RlIG5vZGUsIFhTTE5vZGUgaW5jKSB7Ci0JCQl0cnkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZQotCQkJCQkJLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChub2RlCi0JCQkJCQkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJaW50IGxpbmVPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQlpbnQgY29sID0gbm9kZS5nZXRTdGFydE9mZnNldCgpIC0gbGluZU9mZnNldDsKLQkJCQlpbmMuc2V0TGluZU51bWJlcihsaW5lKTsKLQkJCQlpbmMuc2V0Q29sdW1uTnVtYmVyKGNvbCk7Ci0JCQkJaW5jLnNldExlbmd0aChub2RlLmdldExlbmd0aCgpKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlYU0xDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvU3R5bGVzaGVldE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1N0eWxlc2hlZXRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkzMzI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvU3R5bGVzaGVldE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci0KLS8qKgotICogVGhlIGNvbXBvc2VkIHN0eWxlc2hlZXQsIGNvbnNpc3Rpbmcgb2YgYWxsIHRlbXBsYXRlcyBhbmQgdmFyaWFibGVzIGF2YWlsYWJsZQotICogdmlhIGltcG9ydHMgYW5kIGluY2x1ZGVzLgotICogCi0gKiA8cD4KLSAqIFRoZSA8Y29kZT5maXgoKTwvY29kZT4gbWV0aG9kIGRvZXMgdGhlIGFjdHVhbCB3b3JrIG9mIHBvcHVsYXRpbmcgdGhlIGZpZWxkcwotICogb2YgdGhpcywgc28gaXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZSBvdGhlciBtZXRob2RzLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGlzIG1vZGVsIG1heSBub3QgYmUgdmFsaWQgLSBmb3IgaW5zdGFuY2UgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbgotICogb25lIG5hbWVkIHRlbXBsYXRlIGZvciBhIGdpdmVuIG5hbWUgb3IgbW9yZSB0aGFuIG9uZSBnbG9iYWwgdmFyaWFibGUgd2l0aCBhCi0gKiBnaXZlbiBuYW1lLgotICogPC9wPgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZXNoZWV0TW9kZWwgewotCXByaXZhdGUgZmluYWwgU3R5bGVzaGVldCBzdHlsZXNoZWV0OwotCWJvb2xlYW4gY2lyY3VsYXJSZWZlcmVuY2U7Ci0JZmluYWwgU2V0PElGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PElGaWxlPigpOwotCWZpbmFsIFNldDxTdHlsZXNoZWV0PiBzdHlsZXNoZWV0cyA9IG5ldyBIYXNoU2V0PFN0eWxlc2hlZXQ+KCk7Ci0JZmluYWwgU2V0PFRlbXBsYXRlPiB0ZW1wbGF0ZVNldCA9IG5ldyBIYXNoU2V0PFRlbXBsYXRlPigpOwotCWZpbmFsIExpc3Q8VGVtcGxhdGU+IHRlbXBsYXRlcyA9IG5ldyBBcnJheUxpc3Q8VGVtcGxhdGU+KCk7Ci0JZmluYWwgTGlzdDxWYXJpYWJsZT4gZ2xvYmFsVmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxWYXJpYWJsZT4oKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0Ci0JICogICAgICAgICAgICB0aGUgc3R5bGVzaGVldCB0aGF0IHRoaXMgaXMgdGhlIG1vZGVsIGZvcgotCSAqLwotCXB1YmxpYyBTdHlsZXNoZWV0TW9kZWwoU3R5bGVzaGVldCBzdHlsZXNoZWV0KSB7Ci0JCXRoaXMuc3R5bGVzaGVldCA9IHN0eWxlc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBzdHlsZXNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIHN0eWxlc2hlZXQgYW55d2hlcmUgaW4gdGhlCi0JICogaGllcmFyY2h5IHZpYSBlaXRoZXIgaW1wb3J0IG9yIGluY2x1ZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2V0IG9mIHN0eWxlc2hlZXRzIGluIHRoZSBlbnRpcmUgaGllcmFyY2h5Ci0JICovCi0JcHVibGljIFNldDxTdHlsZXNoZWV0PiBnZXRJbmNsdWRlZFN0eWxlc2hlZXRzKCkgewotCQlyZXR1cm4gc3R5bGVzaGVldHM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIHN0eWxlc2hlZXQgYW55d2hlcmUgaW4gdGhlCi0JICogaGllcmFyY2h5IHZpYSBlaXRoZXIgaW1wb3J0IG9yIGluY2x1ZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2V0IG9mIGZpbGVzIGluIHRoZSBlbnRpcmUgaGllcmFyY2h5Ci0JICovCi0JcHVibGljIFNldDxJRmlsZT4gZ2V0RmlsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3R5bGVzaGVldCB0aGF0IHRoaXMgaXMgdGhlIG1vZGVsIGZvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBpcyB0aGUgbW9kZWwgZm9yCi0JICovCi0JcHVibGljIFN0eWxlc2hlZXQgZ2V0U3R5bGVzaGVldCgpIHsKLQkJcmV0dXJuIHRoaXMuc3R5bGVzaGVldDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhpcyBzdHlsZXNoZWV0IGFueXdoZXJlIGluCi0JICogdGhlIGhpZXJhcmNoeSB2aWEgZWl0aGVyIGltcG9ydCBvciBpbmNsdWRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBmaWxlcyBpbiB0aGUgZW50aXJlIGhpZXJhcmNoeQotCSAqLwotCXB1YmxpYyBMaXN0PFZhcmlhYmxlPiBnZXRHbG9iYWxWYXJpYWJsZXMoKSB7Ci0JCXJldHVybiBnbG9iYWxWYXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCB0ZW1wbGF0ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhpcyBzdHlsZXNoZWV0IGFueXdoZXJlIGluIHRoZQotCSAqIGhpZXJhcmNoeSB2aWEgZWl0aGVyIGltcG9ydCBvciBpbmNsdWRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiB0ZW1wbGF0ZXMgaW4gdGhlIGVudGlyZSBoaWVyYXJjaHkKLQkgKi8KLQlwdWJsaWMgTGlzdDxUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCkgewotCQlyZXR1cm4gdGVtcGxhdGVzOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgbmFtZWQgdGVtcGxhdGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoaXMgc3R5bGVzaGVldCBhbnl3aGVyZSBpbgotCSAqIHRoZSBoaWVyYXJjaHkgdmlhIGVpdGhlciBpbXBvcnQgb3IgaW5jbHVkZSB3aGljaCBoYXZlIHRoZSBnaXZlbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgbmFtZQotCSAqIEByZXR1cm4gdGhlIHNldCBvZiBuYW1lZCB0ZW1wbGF0ZXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXB1YmxpYyBMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXNCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdDxUZW1wbGF0ZT4gbWF0Y2hpbmcgPSBuZXcgQXJyYXlMaXN0PFRlbXBsYXRlPih0ZW1wbGF0ZXMuc2l6ZSgpKTsKLQkJZm9yIChUZW1wbGF0ZSB0ZW1wbGF0ZSA6IHRlbXBsYXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKHRlbXBsYXRlLmdldE5hbWUoKSkpCi0JCQkJbWF0Y2hpbmcuYWRkKHRlbXBsYXRlKTsKLQkJfQotCQlyZXR1cm4gbWF0Y2hpbmc7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCB0ZW1wbGF0ZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gdGVtcGxhdGUgKGRldGVybWluZWQgZnJvbQotCSAqIDxjb2RlPlRlbXBsYXRlLmVxdWFscygpPC9jb2RlPikuCi0JICogCi0JICogQHBhcmFtIHRvTWF0Y2gKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSB0byBtYXRjaAotCSAqIEByZXR1cm4gdGhlIHNldCBvZiB0ZW1wbGF0ZXMgdGhhdCBtYXRjaAotCSAqLwotCXB1YmxpYyBMaXN0PFRlbXBsYXRlPiBmaW5kTWF0Y2hpbmcoVGVtcGxhdGUgdG9NYXRjaCkgewotCQlMaXN0PFRlbXBsYXRlPiBtYXRjaGluZyA9IG5ldyBBcnJheUxpc3Q8VGVtcGxhdGU+KHRlbXBsYXRlcy5zaXplKCkpOwotCQlmb3IgKFRlbXBsYXRlIHRlbXBsYXRlIDogdGVtcGxhdGVzKSB7Ci0JCQlpZiAodGVtcGxhdGUuZXF1YWxzKHRvTWF0Y2gpKQotCQkJCW1hdGNoaW5nLmFkZCh0ZW1wbGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoaW5nOwotCX0KLQotCS8qKgotCSAqIEdldCB3aGV0aGVyIHRoaXMgaGFzIGEgY2lyY3VsYXIgcmVmZXJlbmNlIGFueXdoZXJlIGluIGl0cyBpbXBvcnQvaW5jbHVkZWQKLQkgKiBoaWVyYXJjaHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGhhcyBhIGNpcmN1bGFyIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NpcmN1bGFyUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gY2lyY3VsYXJSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgcHJvY2VzcyBvZiB0cmF2ZXJzaW5nIHRoZSBoaWVyYXJjaHkgdG8gZGV0ZXJtaW5lIGFsbCBvZiB0aGUKLQkgKiBwcm9wZXJ0aWVzIG9mIHRoaXMuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgZm9yY2Ugb3RoZXIKLQkgKiA8Y29kZT5TdHlsZXNoZWV0TW9kZWw8L2NvZGU+J3MgdG8gYmUgYnVpbHQgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIGZpeGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXgoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoRGVidWcuZGVidWdYU0xNb2RlbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaXhpbmcgIiArIHN0eWxlc2hlZXQuZ2V0RmlsZSgpICsgIi4uLiIpOwotCQl9Ci0JCXRlbXBsYXRlcy5hZGRBbGwoc3R5bGVzaGVldC50ZW1wbGF0ZXMpOwotCQl0ZW1wbGF0ZVNldC5hZGRBbGwoc3R5bGVzaGVldC50ZW1wbGF0ZXMpOwotCQlmb3IgKEluY2x1ZGUgaW5jIDogc3R5bGVzaGVldC5pbmNsdWRlcykgewotCQkJaGFuZGxlSW5jbHVkZShpbmMpOwotCQl9Ci0JCWZvciAoSW5jbHVkZSBpbmMgOiBzdHlsZXNoZWV0LmltcG9ydHMpIHsKLQkJCWhhbmRsZUluY2x1ZGUoaW5jKTsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdYU0xNb2RlbCkgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRklYICIgKyBzdHlsZXNoZWV0LmdldEZpbGUoKSArICIgaW4gIgotCQkJCQkrIChlbmQgLSBzdGFydCkgKyAibXMiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVJbmNsdWRlKEluY2x1ZGUgaW5jbHVkZSkgewotCQlJRmlsZSBmaWxlID0gaW5jbHVkZS5nZXRIcmVmQXNGaWxlKCk7Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKHN0eWxlc2hlZXQuZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSB8fCBmaWxlcy5jb250YWlucyhmaWxlKSkgewotCQkJY2lyY3VsYXJSZWZlcmVuY2UgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbGVzLmFkZChmaWxlKTsKLQotCQlTdHlsZXNoZWV0TW9kZWwgaW5jbHVkZWRNb2RlbCA9IFhTTENvcmUuZ2V0SW5zdGFuY2UoKS5nZXRTdHlsZXNoZWV0KAotCQkJCWZpbGUpOwotCQlpZiAoaW5jbHVkZWRNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzdHlsZXNoZWV0cy5hZGQoaW5jbHVkZWRNb2RlbC5nZXRTdHlsZXNoZWV0KCkpOwotCi0JCWlmIChpbmNsdWRlLmdldEluY2x1ZGVUeXBlKCkgPT0gSW5jbHVkZS5JTkNMVURFKSB7Ci0JCQl0ZW1wbGF0ZXMuYWRkQWxsKGluY2x1ZGVkTW9kZWwudGVtcGxhdGVzKTsKLQkJCXRlbXBsYXRlU2V0LmFkZEFsbChpbmNsdWRlZE1vZGVsLnRlbXBsYXRlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKFRlbXBsYXRlIGluY2x1ZGVkVGVtcGxhdGUgOiBpbmNsdWRlZE1vZGVsLnRlbXBsYXRlcykgewotCQkJCWlmICghdGVtcGxhdGVTZXQuY29udGFpbnMoaW5jbHVkZWRUZW1wbGF0ZSkpIHsKLQkJCQkJdGVtcGxhdGVzLmFkZChpbmNsdWRlZFRlbXBsYXRlKTsKLQkJCQkJdGVtcGxhdGVTZXQuYWRkKGluY2x1ZGVkVGVtcGxhdGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1RlbXBsYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1RlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZjRmNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9UZW1wbGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIDxjb2RlPnhzbDp0ZW1wbGF0ZTwvY29kZT4gbW9kZWwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBYU0xFbGVtZW50Ci17Ci0JZmluYWwgTGlzdDxWYXJpYWJsZT4gdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxWYXJpYWJsZT4oKTsKLQlmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyPigpOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIFRlbXBsYXRlKFN0eWxlc2hlZXQgc3R5bGVzaGVldCkKLQl7Ci0JCXN1cGVyKHN0eWxlc2hlZXQpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBwYXJhbWV0ZXIgdG8gdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyYW1ldGVyIHRoZSBwYXJhbWV0ZXIgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpCi0JewotCQlwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSB2YXJpYWJsZSB0byB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSB2YXIgdGhlIHZhcmlhYmxlIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhcmlhYmxlKFZhcmlhYmxlIHZhcikKLQl7Ci0JCXZhcmlhYmxlcy5hZGQodmFyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBhdHRyaWJ1dGUgaWYgb25lIGV4aXN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBuYW1lLCBvciBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPm1hdGNoPC9jb2RlPiBhdHRyaWJ1dGUgaWYgb25lIGV4aXN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYXRjaCB2YWx1ZSwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2goKQotCXsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJtYXRjaCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPm1vZGU8L2NvZGU+IGF0dHJpYnV0ZSBpZiBvbmUgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZGUgdmFsdWUsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1vZGUoKQotCXsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJtb2RlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+cHJpb3JpdHk8L2NvZGU+IGF0dHJpYnV0ZSBpZiBvbmUgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByaW9yaXR5IHZhbHVlLCBvciBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmlvcml0eSgpCi0JewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInByaW9yaXR5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBvZiB0aGlzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGFyYW1ldGVycwotCSAqLwotCXB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpCi0JewotCQlyZXR1cm4gcGFyYW1ldGVyczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpCi0JewotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIDMgKyBuYW1lLmhhc2hDb2RlKCk7Ci0JCX0KLQkJU3RyaW5nIG1hdGNoID0gZ2V0TWF0Y2goKTsKLQkJU3RyaW5nIG1vZGUgPSBnZXRNb2RlKCk7Ci0JCVN0cmluZyBwcmlvcml0eSA9IGdldFByaW9yaXR5KCk7Ci0JCWlmIChtYXRjaCAhPSBudWxsKQotCQl7Ci0JCQlpbnQgaGFzaCA9IDMqbWF0Y2guaGFzaENvZGUoKTsKLQkJCWlmIChwcmlvcml0eSAhPSBudWxsKQotCQkJCWhhc2ggKz0gNSpwcmlvcml0eS5oYXNoQ29kZSgpOwotCQkJaWYgKG1vZGUgIT0gbnVsbCkKLQkJCQloYXNoICs9IDcqbW9kZS5oYXNoQ29kZSgpOwotCQkJcmV0dXJuIDUgKyBoYXNoOwotCQl9Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLQl7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZSkKLQkJewotCQkJVGVtcGxhdGUgaW5jbHVkZWRUZW1wbGF0ZSA9IChUZW1wbGF0ZSlvYmo7Ci0JCQlTdHJpbmcgbmFtZTEgPSBnZXROYW1lKCk7Ci0JCQlTdHJpbmcgbWF0Y2gxID0gZ2V0TWF0Y2goKTsKLQkJCVN0cmluZyBtb2RlMSA9IGdldE1vZGUoKTsKLQkJCVN0cmluZyBwcmlvcml0eTEgPSBnZXRQcmlvcml0eSgpOwotCQkJU3RyaW5nIG5hbWUyID0gaW5jbHVkZWRUZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgbWF0Y2gyID0gaW5jbHVkZWRUZW1wbGF0ZS5nZXRNYXRjaCgpOwotCQkJU3RyaW5nIG1vZGUyID0gaW5jbHVkZWRUZW1wbGF0ZS5nZXRNb2RlKCk7Ci0JCQlTdHJpbmcgcHJpb3JpdHkyID0gaW5jbHVkZWRUZW1wbGF0ZS5nZXRQcmlvcml0eSgpOwotCi0JCQlpZiAobmFtZTEgIT0gbnVsbCAmJiBuYW1lMS5lcXVhbHMobmFtZTIpKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG1hdGNoMSAhPSBudWxsICYmIG1hdGNoMS5lcXVhbHMobWF0Y2gyKSAmJiAKLQkJCQkJKG1vZGUxID09IG51bGwgJiYgbW9kZTIgPT0gbnVsbCB8fCBtb2RlMSAhPSBudWxsICYmIG1vZGUxLmVxdWFscyhtb2RlMikpICYmCi0JCQkJCShwcmlvcml0eTEgPT0gbnVsbCAmJiBwcmlvcml0eTIgPT0gbnVsbCB8fCBwcmlvcml0eTEgIT0gbnVsbCAmJiBwcmlvcml0eTEuZXF1YWxzKHByaW9yaXR5MikpCi0JCQkJKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJU3RyaW5nIG1hdGNoID0gZ2V0TWF0Y2goKTsKLQkJcmV0dXJuICJmaWxlPSIrZ2V0U3R5bGVzaGVldCgpLmdldEZpbGUoKSsiLCBuYW1lPSIrbmFtZSsiLCBtYXRjaD0iK21hdGNoOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvVmFyaWFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1MGU0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1ZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLS8qKgotICogVGhlIDxjb2RlPnhzbDp2YXJpYWJsZTwvY29kZT4gbW9kZWwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFibGUgZXh0ZW5kcyBYU0xFbGVtZW50Ci17Ci0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHN0eWxlc2hlZXQgdGhlIHN0eWxlc2hlZXQgdGhhdCB0aGlzIGJlbG9uZ3MgdG8KLQkgKi8KLQlwdWJsaWMgVmFyaWFibGUoU3R5bGVzaGVldCBzdHlsZXNoZWV0KQotCXsKLQkJc3VwZXIoc3R5bGVzaGVldCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+bmFtZTwvY29kZT4gYXR0cmlidXRlIGlmIG9uZSBleGlzdHMuCi0JICogCi0JICogQHJldHVybiB0aGUgdmFyaWFibGUgbmFtZSwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5zZWxlY3Q8L2NvZGU+IGF0dHJpYnV0ZSBpZiBvbmUgZXhpc3RzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlbGVjdCB2YWx1ZSwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0KCkKLQl7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgic2VsZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1hTTEF0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9YU0xBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2OTgwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1hTTEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsOwotCi0vKioKLSAqIEFuIGF0dHJpYnV0ZSBvZiBhbiBlbGVtZW50IGluIHRoZSBYU0wgbmFtZXNwYWNlLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xBdHRyaWJ1dGUgZXh0ZW5kcyBYU0xOb2RlCi17Ci0JZmluYWwgU3RyaW5nIG5hbWU7Ci0JZmluYWwgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdGhpcyBiZWxvbmdzIHRvCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBYU0xBdHRyaWJ1dGUoWFNMRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotCXsKLQkJc3VwZXIoZWxlbWVudC5nZXRTdHlsZXNoZWV0KCksIFhTTE5vZGUuQVRUUklCVVRFX05PREUpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgbmFtZSBvZiB0aGlzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhpcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotCXsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvWFNMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9YU0xFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NzEyNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbC9YU0xFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEFuIGVsZW1lbnQgaW4gdGhlIFhTTCBuYW1lc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFhTTEVsZW1lbnQgZXh0ZW5kcyBYU0xOb2RlCi17Ci0JZmluYWwgTWFwPFN0cmluZywgWFNMQXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBYU0xBdHRyaWJ1dGU+KCk7Ci0JZmluYWwgTGlzdDxYU0xFbGVtZW50PiBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxYU0xFbGVtZW50PigpOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRoYXQgdGhpcyBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIFhTTEVsZW1lbnQoU3R5bGVzaGVldCBzdHlsZXNoZWV0KQotCXsKLQkJc3VwZXIoc3R5bGVzaGVldCwgWFNMTm9kZS5FTEVNRU5UX05PREUpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYW4gYXR0cmlidXRlIG9mIHRoaXMKLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFhTTEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCi0JewotCQlhdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlCi0JICovCi0JcHVibGljIFhTTEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlcy5nZXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhdHRyaWJ1dGVzIGtleWVkIGJ5IHRoZWlyIG5hbWVzLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYXAgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgWFNMQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZSkKLQl7Ci0JCVhTTEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZSA9PSBudWxsID8gbnVsbCA6IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgY2hvbGQgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKFhTTEVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWNoaWxkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIExpc3Q8WFNMRWxlbWVudD4gZ2V0Q2hpbGRFbGVtZW50cygpCi0JewotCQlyZXR1cm4gY2hpbGRFbGVtZW50czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL21vZGVsL1hTTE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvWFNMTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTlmZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWwvWFNMTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybU9iamVjdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEEgbm9kZSBpbiB0aGUgWFNMIG5hbWVzcGFjZS4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNMTm9kZSBleHRlbmRzIFBsYXRmb3JtT2JqZWN0Ci17Ci0JLyoqCi0JICogQSBjb25zdGFudCBmb3IgdGhlIGVsZW1lbnQgbm9kZSAoPSA8Y29kZT5vcmcudzNjLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERTwvY29kZT4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBFTEVNRU5UX05PREUgPSBOb2RlLkVMRU1FTlRfTk9ERTsKLQkKLQkvKioKLQkgKiBBIGNvbnN0YW50IGZvciB0aGUgYXR0cmlidXRlIG5vZGUgKD0gPGNvZGU+b3JnLnczYy5kb20uTm9kZS5BVFRSSUJVVEVfTk9ERTwvY29kZT4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBBVFRSSUJVVEVfTk9ERSA9IE5vZGUuQVRUUklCVVRFX05PREU7Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBTdHlsZXNoZWV0IHN0eWxlc2hlZXQ7Ci0JaW50IGxpbmVOdW1iZXI7Ci0JaW50IGNvbHVtbk51bWJlcjsKLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoOwotCXByaXZhdGUgc2hvcnQgdHlwZTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVzaGVldCB0aGUgc3R5bGVzaGVldCB0aGlzIGJlbG9uZ3MgdG8KLQkgKiBAcGFyYW0gdHlwZSBvbmUgb2YgPGNvZGU+RUxFTUVOVF9OT0RFPC9jb2RlPiBvciA8Y29kZT5BVFRSSUJVVEVfTk9ERTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgWFNMTm9kZShTdHlsZXNoZWV0IHN0eWxlc2hlZXQsIHNob3J0IHR5cGUpCi0JewotCQl0aGlzLnN0eWxlc2hlZXQgPSBzdHlsZXNoZWV0OwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhpcyBub2RlIG9jY3VycyBpbiB0aGUgWFNMIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGxpbmVOdW1iZXIgdGhlIGxpbmUgbnVtYmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikKLQl7Ci0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjb2x1bW5zIG51bWJlciB3aGVyZSB0aGlzIG5vZGUgb2NjdXJzIGluIHRoZSBYU0wgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uTnVtYmVyIHRoZSBjb2x1bW4gbnVtYmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uTnVtYmVyKGludCBjb2x1bW5OdW1iZXIpCi0JewotCQl0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN0eWxlc2hlZXQgdGhhdCB0aGlzIGJlbG9uZ3MgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgc3R5bGVzaGVldAotCSAqLwotCXB1YmxpYyBTdHlsZXNoZWV0IGdldFN0eWxlc2hlZXQoKQotCXsKLQkJcmV0dXJuIHN0eWxlc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGlzIG5vZGUgb2NjdXJzIGluIHRoZSBYU0wgZmlsZS4KLQkgKiBAcmV0dXJuIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGlzIG5vZGUgb2NjdXJzIGluIHRoZSBYU0wgZmlsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKQotCXsKLQkJcmV0dXJuIGxpbmVOdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoaXMgbm9kZSBvY2N1cnMgaW4gdGhlIFhTTCBmaWxlLgotCSAqIEByZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgd2hlcmUgdGhpcyBub2RlIG9jY3VycyBpbiB0aGUgWFNMIGZpbGUuCi0JICovCi0JcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotCXsKLQkJcmV0dXJuIGNvbHVtbk51bWJlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRvY3VtZW50IG9mZnNldCB3aGVyZSB0aGlzIG5vZGUgb2NjdXJzLgotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIGRvY3VtZW50IG9mZnNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KQotCXsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgZG9jdW1lbnQgb2Zmc2V0IHdoZXJlIHRoaXMgbm9kZSBvY2N1cnMuCi0JICogQHJldHVybiB0aGUgZG9jdW1lbnQgb2Zmc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKQotCXsKLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxlbmd0aCBvZiB0aGlzIG5vZGUuCi0JICogQHBhcmFtIGxlbmd0aCB0aGUgbm9kZSBsZW5ndGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkKLQl7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGlzIG5vZGUuCi0JICogQHJldHVybiB0aGUgbm9kZSBsZW5ndGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpCi0JewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHR5cGUgb2Ygbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9uZSBvZiA8Y29kZT5FTEVNRU5UX05PREU8L2NvZGU+IG9yIDxjb2RlPkFUVFJJQlVURV9OT0RFPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJmaWxlPSIrc3R5bGVzaGVldCsiLCBsaW5lPSIrbGluZU51bWJlcisiLCBjb2w9Iitjb2x1bW5OdW1iZXI7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMDBiODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlZhbGlkYXRpb25QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuWFNMQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBQcmVmZXJlbmNlcyBpbml0aWFsaXplciBmb3IgWFNMIGNvcmUgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyCi17Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShYU0xDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCW5vZGUucHV0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NQVhfRVJST1JTLCAxMDApOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUlTU0lOR19QQVJBTSwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoVmFsaWRhdGlvblByZWZlcmVuY2VzLlhQQVRIUywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW5vZGUucHV0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DQUxMX1RFTVBMQVRFUywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW5vZGUucHV0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5FTVBUWV9QQVJBTSwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoVmFsaWRhdGlvblByZWZlcmVuY2VzLk1JU1NJTkdfSU5DTFVERSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW5vZGUucHV0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DSVJDVUxBUl9SRUYsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuVEVNUExBVEVfQ09ORkxJQ1QsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQlub2RlLnB1dEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTkFNRV9BVFRSSUJVVEVfTUlTU0lORywgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW5vZGUucHV0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5OQU1FX0FUVFJJQlVURV9FTVBUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCW5vZGUucHV0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5EVVBMSUNBVEVfUEFSQU1FVEVSLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvRGVidWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDY3Y2E2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBXVFAgU1NFIERlYnVnIGNsYXNzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotLyoqCi0gKiBEZWJ1ZyBDbGFzcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGVuIERlYnVnZ2luZyBvdXRwdXQgdG8gc3lzdGVtIG91dC4KLSAqIEBhdXRob3IgZGNhcnZlcgotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERlYnVnIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JNZW1vcnlMZWFrcyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbGxlY3RTdGF0cyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVCVUcgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RIUkVBRExPQ0FMID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdCcmVha3BvaW50cyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0NhcmV0TWVkaWF0b3IgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdEaXNwbGF5VHJlZVBvc2l0aW9ucyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTWVkaWF0b3IgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTm90aWZ5RGVmZXJyZWQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdSZWNvbmNpbGluZyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUnRmRm9ybWF0UHJvdmlkZXIgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1RhZ2xpYnMgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1Rva2VuaXplciA9IGZhbHNlOwotCQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTGF1bmNoZXIgPSBmYWxzZTsKLQkKLQkvKioKLQkgKiBPdXRwdXQgTW9kZWxpbmcgTWVzc2FnZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnWFNMTW9kZWwgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1RyZWVNb2RlbCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1VwZGF0ZVRyZWVQb3NpdGlvbnMgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGlzcGxheUluZm8gPSBmYWxzZTsKLQotCS8qKiBlZmZlY3RzIG91dHB1dCBvZiBMb2dnZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGlzcGxheVRvQ29uc29sZSA9IHRydWU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc3BsYXlXYXJuaW5ncyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhlYWRQYXJzaW5nID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGpzRGVidWdDb250ZXh0QXNzaXN0ID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4ganNEZWJ1Z1N5bnRheENvbG9yaW5nID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DS1MgPSBmYWxzZTsKLQkvLyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3QgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RBZGFwdGVyQ2xhc3NMb2FkaW5nID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0Rm9ybWF0ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0UmF3U3RydWN0dXJlZERvY3VtZW50T25seSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkgPSBmYWxzZTsKLQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN5bnRheEhpZ2hsaWdodGluZyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZVN0YW5kYXJkRW9sSW5XaWRnZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEZvciB0ZXN0cyBhbmQgZGVidWcgb25seQotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXAoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJZHVtcChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZHVtcChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRHVtcCBvZiBzdHJ1Y3R1cmVkRG9jdW1lbnQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJRW51bWVyYXRpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGZsYXROb2Rlcy5lbGVtZW50cygpOwotCQl3aGlsZSAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZmxhdE5vZGUgPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIXZlcmJvc2UpIHsKLQkJCQlTdHJpbmcgb3V0U3RyaW5nID0gZmxhdE5vZGUudG9TdHJpbmcoKTsKLQkJCQlvdXRTdHJpbmcgPSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHMuZXNjYXBlKG91dFN0cmluZyk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG91dFN0cmluZyk7Ci0JCQl9IGVsc2UgewotCQkJCWR1bXAoZmxhdE5vZGUsIHZlcmJvc2UpOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIj0gPSA9ID0gPSA9Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogQHBhcmFtIHZlcmJvc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZHVtcChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodmVyYm9zZSkgewotCQkJcHJpbnRQYXJlbnQocmVnaW9uKTsKLQkJfQotCQlwcmludENoaWxkUmVnaW9ucyhyZWdpb24sIDApOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRDaGlsZFJlZ2lvbnMoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbiwgaW50IGRlcHRoKSB7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gPT0+IC8vIElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb25Db2xsZWN0aW9uID0gcmVnaW9uOwotCQkJU3lzdGVtLm91dC5wcmludGxuKHJlZ2lvbik7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9uTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKHIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHJjID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcjsKLQkJCQkJcHJpbnRDaGlsZFJlZ2lvbnMocmMsIGRlcHRoKyspOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzcGFjZShkZXB0aCkgKyByKTsKLQkJCQkJZGVwdGgtLTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgdXRpbGl0eSB0byBtYWtlIHN1cmUgcHJpbnRsbidzIGFyZSBzb21lIHdoYXQgaW4gb3JkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHByaW50bG4oU3RyaW5nIG1zZykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiXHQiICsgbXNnKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYXJlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgW3BhcmVudCBkb2N1bWVudDogIiArIHRvU3RyaW5nVXRpbChyZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKSkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGFyZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXByaW50UGFyZW50KChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSByZWdpb24pOwotCQl9IGVsc2UgaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlwcmludFBhcmVudCgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbik7Ci0JCX0gZWxzZQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgW3BhcmVudCBkb2N1bWVudDogIiArICIobmEpIiArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcmVudChJVGV4dFJlZ2lvbkNvbnRhaW5lciByZWdpb24pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgW3BhcmVudCBkb2N1bWVudDogIiArIHRvU3RyaW5nVXRpbChyZWdpb24uZ2V0UGFyZW50KCkpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlcHRoCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzcGFjZShpbnQgZGVwdGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7Ci0JCQlyZXN1bHQgKz0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmdVdGlsKElTdHJ1Y3R1cmVkRG9jdW1lbnQgb2JqZWN0KSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWU7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmdVdGlsKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBvYmplY3QpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZTsKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBEZWJ1ZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZWJ1ZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvRmlsZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY5NDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZ2VuZXJhbCBmaWxlIHV0aWxpdHkgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgZGNhcnZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIEZpbGVVdGlsIHsKLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgYSBmaWxlIGlzIG9uZSBvZiB0aGUgdmFsaWQgWE1MIGNvbnRlbnQgdHlwZXMuCi0JICogQHBhcmFtIGZpbGUgVGhlIGlucHV0IElGaWxlIHRvIGNoZWNrCi0JICogQHJldHVybiBUcnVlIGlmIGl0IGlzIGEgWE1MIGZpbGUsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYTUxGaWxlKElGaWxlIGZpbGUpCi0JewotCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IGNvbnRlbnRUeXBlTWFuYWdlci5maW5kQ29udGVudFR5cGVzRm9yKGZpbGUuZ2V0TmFtZSgpKTsKLQkJZm9yIChJQ29udGVudFR5cGUgY29udGVudFR5cGUgOiB0eXBlcykKLQkJewotCQkJaWYgKGNvbnRlbnRUeXBlLmlzS2luZE9mKGNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZSgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIpKSB8fCBjb250ZW50VHlwZS5pc0tpbmRPZihjb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiKSkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGEgZmlsZSBpcyBhIFhTTFQgRmlsZS4KLQkgKiBAcGFyYW0gZmlsZSBUaGUgaW5wdXQgSUZpbGUgdG8gY2hlY2suCi0JICogQHJldHVybiBUcnVlIGlmIGl0IGlzIGEgWFNMVCBmaWxlLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzWFNMRmlsZShJRmlsZSBmaWxlKQotCXsKLQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBjb250ZW50VHlwZU1hbmFnZXIuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCWZvciAoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlIDogdHlwZXMpCi0JCXsKLQkJCWlmIChjb250ZW50VHlwZS5lcXVhbHMoY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKFhTTENvcmUuWFNMX0NPTlRFTlRfVFlQRSkpKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdXRpbC9TdHJ1Y3R1cmVkRG9jdW1lbnRVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3V0aWwvU3RydWN0dXJlZERvY3VtZW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI3ZDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdXRpbC9TdHJ1Y3R1cmVkRG9jdW1lbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIEdlbmVyYWwgUHVycG9zZSB1dGlsaXR5IGNsYXNzZXMgdG8gY29udmVydCBmcm9tIFN0cnVjdHVyZWREb2N1bWVudCB0byBET00uCi0gKiAKLSAqIEBhdXRob3IgZGNhcnZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFV0aWwgewotCQotCS8qKgotCSAqIEdpdmVuIGEgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuZCBhIFRleHRSZWdpb24sIHJldHVybiBhCi0JICogSURPTU5vZGUgZm9yIHRoYXQgcGFydGljdWxhciBwb3NpdGlvbiBpbiB0aGUgU3RydWN0dXJlZERvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIHRleHRSZWdpb24KLQkgKiBAcmV0dXJuIElET01Ob2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBJRE9NTm9kZSBnZXROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50UmVnaW9uLmdldFBhcmVudERvY3VtZW50KCkpOwotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnROb2RlID0gKChJRE9NTW9kZWwpIHNNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQotCQlyZXR1cm4gKElET01Ob2RlKWRvY3VtZW50Tm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL01heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vTWF4RXJyb3JzRXhjZWVkZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwYmM4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vTWF4RXJyb3JzRXhjZWVkZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEFuIGV4Y2VwdGlvbiB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9ycyBoYXMgYmVlbiByZWFjaGVkIAotICogZm9yIGEgZ2l2ZW4gU3R5bGVzaGVldCB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmY3ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE1lc3NhZ2VzIGZvciB0aGUgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEludmFsaWQgeHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzE7Ci0JLyoqCi0JICogU3R5bGVzaGVldCBpbXBvcnRpbmcgaXRzZWxmCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzEwOwotCS8qKgotCSAqIFRlbXBsYXRlIGNvbmZsaWN0IChpbnRlcm5hbCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMTE7Ci0JLyoqCi0JICogVGVtcGxhdGUgY29uZmxpY3QgKGluY2x1ZGVkKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl8xMjsKLQkvKioKLQkgKiBUZW1wbGF0ZSBjb25mbGljdCAoZXh0ZXJuYWwpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzEzOwotCS8qKgotCSAqIFBhcmFtZXRlciBtaXNzaW5nIG5hbWUgYXR0cmlidXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzE0OwotCS8qKgotCSAqIFBhcmFtZXRlciB3aXRoIGVtcHR5IG5hbWUgYXR0cmlidXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzE1OwotCS8qKgotCSAqIER1cGxpY2F0ZSBwYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMTY7Ci0JLyoqCi0JICogVW5yZXNvbHZlZCBuYW1lZCB0ZW1wbGF0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl8xODsKLQkvKioKLQkgKiBDaXJjdWxhciByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xWYWxpZGF0b3JfMjsKLQkvKioKLQkgKiBQYXJhbWV0ZXIgd2l0aG91dCBkZWZhdWx0IHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzIwOwotCS8qKgotCSAqIFBhcmFtZXRlciBkb2VzIG5vdCBleGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl8yMjsKLQkvKioKLQkgKiBocmVmIGF0dHJpYnV0ZSBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl8yMzsKLQkvKioKLQkgKiBNaXNzaW5nIHBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl8zOwotCS8qKgotCSAqIFVucmVzb2x2ZWQgaW5jbHVkZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTFZhbGlkYXRvcl80OwotCS8qKgotCSAqIFN0eWxlc2hlZXQgaW5jbHVkZXMgaXRzZWxmCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzY7Ci0JLyoqCi0JICogIFVucmVzb2x2ZWQgaW1wb3J0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMVmFsaWRhdG9yXzg7Ci0KLQlzdGF0aWMKLQl7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTFZhbGlkYXRpb25NZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3ZjNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuWFNMTm9kZTsKLQotLyoqCi0gKiBBIHZhbGlkYXRpb24gbWVzc2FnZSBzcGVjaWZpYyB0byB0aGUgWFNMIHZhbGlkYXRvciB3aGljaCBhZGRzIHRoZSBhYmlsaXR5IAotICogdG8gc3BlY2lmeSB0aGUgWFNMIG5vZGUuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZQotICovCi1wdWJsaWMgY2xhc3MgWFNMVmFsaWRhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBWYWxpZGF0aW9uTWVzc2FnZQotewotCXByaXZhdGUgWFNMTm9kZSBub2RlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JICogICAgICAgICAgICBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gY29sdW1uTnVtYmVyCi0JICogICAgICAgICAgICBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhlIG1lc3NhZ2UgaXMgZm9yLgotCSAqLwotCXB1YmxpYyBYU0xWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIFN0cmluZyB1cmkpCi0JewotCQlzdXBlcihtZXNzYWdlLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIHVyaSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgbm9kZSB0aGF0IHRoaXMgbWVzc2FnZSBhcHBsaWVzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZShYU0xOb2RlIG5vZGUpCi0JewotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbm9kZSB0aGF0IHRoaXMgbWVzc2FnZSBhcHBsaWVzIHRvLgotCSAqIEByZXR1cm4gdGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgWFNMTm9kZSBnZXROb2RlKCkKLQl7Ci0JCXJldHVybiBub2RlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBub2RlLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTFZhbGlkYXRpb25SZXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0xWYWxpZGF0aW9uUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTdhZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTFZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuWFNMTm9kZTsKLQotLyoqCi0gKiBBIHZhbGlkYXRpb24gcmVwb3J0IGZvciB0aGUgWFNMIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQKLSAqLwotcHVibGljIGNsYXNzIFhTTFZhbGlkYXRpb25SZXBvcnQgaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0Ci17Ci0JcHJpdmF0ZSBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyB1cmk7Ci0JcHJpdmF0ZSBMaXN0PFhTTFZhbGlkYXRpb25NZXNzYWdlPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PFhTTFZhbGlkYXRpb25NZXNzYWdlPigpOwotCXByaXZhdGUgTGlzdDxYU0xWYWxpZGF0aW9uTWVzc2FnZT4gd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0PFhTTFZhbGlkYXRpb25NZXNzYWdlPigpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIFVSSSBvZiB0aGUgZW50aXR5IHRoYXQgdGhpcyByZXBvcnQgYXBwbGllcyB0bwotCSAqLwotCXB1YmxpYyBYU0xWYWxpZGF0aW9uUmVwb3J0KFN0cmluZyB1cmkpCi0JewotCQl0aGlzLnVyaSA9IHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGVycm9yIGxldmVsIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0JICogCi0JICogQHJldHVybiBlcnJvciBsZXZlbCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0JcHVibGljIExpc3Q8WFNMVmFsaWRhdGlvbk1lc3NhZ2U+IGdldEVycm9ycygpCi0JewotCQlyZXR1cm4gZXJyb3JzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd2FybiBsZXZlbCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotCSAqIAotCSAqIEByZXR1cm4gd2FybiBsZXZlbCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0JcHVibGljIExpc3Q8WFNMVmFsaWRhdGlvbk1lc3NhZ2U+IGdldFdhcm5pbmdzKCkKLQl7Ci0JCXJldHVybiB3YXJuaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIFhTTCBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB0aGUgbm9kZSB0aGUgZXJyb3IgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbm9kZQotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBjcmVhdGVkCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlIGFkZEVycm9yKFhTTE5vZGUgbm9kZSwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQl2YWxpZCA9IGZhbHNlOwotCQlYU0xWYWxpZGF0aW9uTWVzc2FnZSBtc2cgPSBuZXcgWFNMVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbm9kZS5nZXRMaW5lTnVtYmVyKCkgKyAxLCBub2RlLmdldENvbHVtbk51bWJlcigpICsgMSwgZ2V0RmlsZVVSSSgpKTsKLQkJbXNnLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9ISUdIKTsKLQkJbXNnLnNldE5vZGUobm9kZSk7Ci0JCWVycm9ycy5hZGQobXNnKTsKLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gd2FybmluZyBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gWFNMIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBub2RlIHRoZSB3YXJuaW5nIGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5vZGUKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZSBhZGRXYXJuaW5nKFhTTE5vZGUgbm9kZSwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlYU0xWYWxpZGF0aW9uTWVzc2FnZSBtc2cgPSBuZXcgWFNMVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbm9kZS5nZXRMaW5lTnVtYmVyKCkgKyAxLCBub2RlLmdldENvbHVtbk51bWJlcigpICsgMSwgZ2V0RmlsZVVSSSgpKTsKLQkJbXNnLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpOwotCQltc2cuc2V0Tm9kZShub2RlKTsKLQkJd2FybmluZ3MuYWRkKG1zZyk7Ci0JCXJldHVybiBtc2c7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBVUkkgdGhhdCB0aGlzIHJlcG9ydCBhcHBsaWVzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSSQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpCi0JewotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5nZXROZXN0ZWRNZXNzYWdlcwotCSAqIAotCSAqIEByZXR1cm4gbnVsbAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkKLQl7Ci0JCUxpc3Q8VmFsaWRhdGlvbk1lc3NhZ2U+IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uTWVzc2FnZT4oZXJyb3JzKTsKLQkJbWVzc2FnZXMuYWRkQWxsKHdhcm5pbmdzKTsKLQkJcmV0dXJuIG1lc3NhZ2VzLnRvQXJyYXkobmV3IFZhbGlkYXRpb25NZXNzYWdlWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgaXMgdmFsaWQuIFRoZSBmaWxlIG1heSBoYXZlIHdhcm5pbmdzIGFzc29jaWF0ZWQgd2l0aCBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLQl7Ci0JCXJldHVybiB2YWxpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YTM3ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbC5YU0xUWFBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlZhbGlkYXRpb25QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuWFNMQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuQ2FsbFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5JbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLlN0eWxlc2hlZXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLlhTTEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuWFNMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuWFNMTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLQotLyoqCi0gKiBUaGUgWFNMIHZhbGlkYXRvciBmb3Igd29ya3NwYWNlIFhTTCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgWFNMVmFsaWRhdG9yCi17Ci0JcHJpdmF0ZSBzdGF0aWMgWFNMVmFsaWRhdG9yIGluc3RhbmNlOwotCi0JcHJpdmF0ZSBYU0xWYWxpZGF0b3IoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gWFNMIGZpbGUuIFNhbWUgYXMgPGNvZGU+dmFsaWRhdGUoeHNsRmlsZSxyZXBvcnQsZm9yY2VCdWlsZCk8L2NvZGU+IGV4Y2VwdCBhIG5ldyByZXBvcnQgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIHhzbEZpbGUgdGhlIFhTTCBmaWxlCi0JICogQHBhcmFtIGZvcmNlQnVpbGQgdHJ1ZSBpZiBidWlsZCBzaG91bGQgYWx3YXlzIGJlIGZvcmNlZAotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRpb24gcmVwb3J0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHZhbGlkYXRpbmcKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShJRmlsZSB4c2xGaWxlLCBib29sZWFuIGZvcmNlQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCA9IG5ldyBYU0xWYWxpZGF0aW9uUmVwb3J0KHhzbEZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpKTsKLQkJdmFsaWRhdGUoeHNsRmlsZSwgcmVwb3J0LCBmb3JjZUJ1aWxkKTsKLQkJcmV0dXJuIHJlcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gWFNMIGZpbGUgdXNpbmcgdGhlIHNwZWNpZmllZCByZXBvcnQuCi0JICogCi0JICogQHBhcmFtIHhzbEZpbGUgdGhlIFhTTCBmaWxlCi0JICogQHBhcmFtIHJlcG9ydCB0aGUgcmVwb3J0IHRvIHVzZSBmb3IgcmVwb3J0aW5nIHZhbGlkYXRpb24gZXJyb3JzCi0JICogQHBhcmFtIGZvcmNlQnVpbGQgdHJ1ZSBpZiBidWlsZCBzaG91bGQgYWx3YXlzIGJlIGZvcmNlZAotCSAqIEByZXR1cm4gdGhlIHZhbGlkYXRpb24gcmVwb3J0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHZhbGlkYXRpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRmlsZSB4c2xGaWxlLCBYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCwgYm9vbGVhbiBmb3JjZUJ1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3R5bGVzaGVldE1vZGVsIHN0eWxlc2hlZXQ7Ci0JCWlmIChmb3JjZUJ1aWxkKQotCQkJc3R5bGVzaGVldCA9IFhTTENvcmUuZ2V0SW5zdGFuY2UoKS5idWlsZFN0eWxlc2hlZXQoeHNsRmlsZSk7Ci0JCWVsc2UKLQkJCXN0eWxlc2hlZXQgPSBYU0xDb3JlLmdldEluc3RhbmNlKCkuZ2V0U3R5bGVzaGVldCh4c2xGaWxlKTsKLQotCQlsb25nIHN0YXJ0OwotCQlpZiAoRGVidWcuZGVidWdYU0xNb2RlbCkgewotCQkJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAoc3R5bGVzaGVldCE9bnVsbCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJY2FsY3VsYXRlUHJvYmxlbXMoc3R5bGVzaGVldCwgcmVwb3J0KTsKLQkJCX0KLQkJCWNhdGNoIChNYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfQotCQlpZiAoRGVidWcuZGVidWdYU0xNb2RlbCkgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVkFMSURBVEUgIit4c2xGaWxlKyIgaW4gIisoZW5kLXN0YXJ0KSsibXMiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQcm9ibGVtcyhTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldENvbXBvc2VkLCBYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCkgdGhyb3dzIE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uCi0JewotCQkvLyBjaXJjdWxhciByZWZlcmVuY2UgY2hlY2sKLQkJY2hlY2tDaXJjdWxhclJlZihzdHlsZXNoZWV0Q29tcG9zZWQsIHJlcG9ydCk7Ci0JCS8vIGluY2x1ZGUgY2hlY2tzCi0JCWNoZWNrSW5jbHVkZXMoc3R5bGVzaGVldENvbXBvc2VkLCByZXBvcnQpOwotCQkvLyB0ZW1wbGF0ZSBjaGVja3MKLQkJY2hlY2tUZW1wbGF0ZXMoc3R5bGVzaGVldENvbXBvc2VkLCByZXBvcnQpOwotCQkvLyBjYWxsLXRlbXBsYXRlIGNoZWNrcwotCQljaGVja0NhbGxUZW1wbGF0ZXMoc3R5bGVzaGVldENvbXBvc2VkLCByZXBvcnQpOwotCQkvLyBjYWxsLXRlbXBsYXRlIGNoZWNrcwotCQlpZiAoZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuWFBBVEhTKSA+IElNYXJrZXIuU0VWRVJJVFlfSU5GTykKLQkJCWNoZWNrWFBhdGhzKHN0eWxlc2hlZXRDb21wb3NlZC5nZXRTdHlsZXNoZWV0KCksIHJlcG9ydCk7Ci0JCQotCQkvLyBUT0RPIGEpIGNoZWNrIGdsb2JhbHMgYW5kIGIpIGFwcGx5LXRlbXBsYXRlcyB3aGVyZSBtb2RlIGRvZXMgbm90IGV4aXN0Ci0JfQotCQotCXByaXZhdGUgaW50IGdldFByZWZlcmVuY2UoU3RyaW5nIGtleSkKLQl7Ci0JCXJldHVybiBYU0xDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChrZXkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1hQYXRocyhYU0xFbGVtZW50IHhzbEVsLCBYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCkgdGhyb3dzIE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uCi0JewotCQl2YWxpZGF0ZVhQYXRoKHhzbEVsLCByZXBvcnQsICJzZWxlY3QiKTsgLy8kTk9OLU5MUy0xJAotCQl2YWxpZGF0ZVhQYXRoKHhzbEVsLCByZXBvcnQsICJ0ZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJdmFsaWRhdGVYUGF0aCh4c2xFbCwgcmVwb3J0LCAibWF0Y2giKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKFhTTEVsZW1lbnQgY2hpbGRFbCA6IHhzbEVsLmdldENoaWxkRWxlbWVudHMoKSkKLQkJewotCQkJY2hlY2tYUGF0aHMoY2hpbGRFbCwgcmVwb3J0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVhQYXRoKFhTTEVsZW1lbnQgeHNsRWwsIFhTTFZhbGlkYXRpb25SZXBvcnQgcmVwb3J0LCBTdHJpbmcgYXR0TmFtZSkgdGhyb3dzIE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uCi0JewotCQlYU0xBdHRyaWJ1dGUgYXR0ID0geHNsRWwuZ2V0QXR0cmlidXRlKGF0dE5hbWUpOwotCQlpZiAoYXR0ICE9IG51bGwgJiYgYXR0LmdldFZhbHVlKCkgIT0gbnVsbCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJWFNMVFhQYXRoSGVscGVyLmNvbXBpbGUoYXR0LmdldFZhbHVlKCkpOwotCQkJfQotCQkJY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiBlKQotCQkJewotCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIGF0dCwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuWFBBVEhTKSwgTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzEpOwotCQkJfQotCQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJLy8gbm90IHN1cmUgd2h5IE5QRSBpcyBiZWluZyB0aHJvd24gaGVyZQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2lyY3VsYXJSZWYoU3R5bGVzaGVldE1vZGVsIHN0eWxlc2hlZXRDb21wb3NlZCwgWFNMVmFsaWRhdGlvblJlcG9ydCByZXBvcnQpIHRocm93cyBNYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbgotCXsKLQkJaWYgKHN0eWxlc2hlZXRDb21wb3NlZC5oYXNDaXJjdWxhclJlZmVyZW5jZSgpKQotCQkJY3JlYXRlTWFya2VyKHJlcG9ydCwgc3R5bGVzaGVldENvbXBvc2VkLmdldFN0eWxlc2hlZXQoKSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuQ0lSQ1VMQVJfUkVGKSwgTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luY2x1ZGVzKFN0eWxlc2hlZXRNb2RlbCBzdHlsZXNoZWV0Q29tcG9zZWQsIFhTTFZhbGlkYXRpb25SZXBvcnQgcmVwb3J0KSB0aHJvd3MgTWF4RXJyb3JzRXhjZWVkZWRFeGNlcHRpb24KLQl7CQkKLQkJLy8gaW5jbHVkZXMKLQkJZm9yIChJbmNsdWRlIGluY2x1ZGUgOiBzdHlsZXNoZWV0Q29tcG9zZWQuZ2V0U3R5bGVzaGVldCgpLmdldEluY2x1ZGVzKCkpCi0JCXsKLQkJCUlGaWxlIGluY2x1ZGVkRmlsZSA9IGluY2x1ZGUuZ2V0SHJlZkFzRmlsZSgpOwotCQkJaWYgKGluY2x1ZGVkRmlsZSA9PSBudWxsIHx8ICFpbmNsdWRlZEZpbGUuZXhpc3RzKCkpCi0JCQl7IC8vIGluY2x1ZGVkIGZpbGUgZG9lcyBub3QgZXhpc3QKLQkJCQlYU0xBdHRyaWJ1dGUgYXR0ID0gaW5jbHVkZS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXR0ICE9IG51bGwpCi0JCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIGF0dCwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUlTU0lOR19JTkNMVURFKSwgTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzQgKyBpbmNsdWRlLmdldEhyZWYoKSk7Ci0JCQkJZWxzZQotCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBpbmNsdWRlLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5OQU1FX0FUVFJJQlVURV9FTVBUWSksIE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8yMyApOwkJCQkJCi0JCQl9Ci0JCQllbHNlIGlmIChpbmNsdWRlZEZpbGUuZXF1YWxzKGluY2x1ZGUuZ2V0U3R5bGVzaGVldCgpLmdldEZpbGUoKSkpCi0JCQl7IC8vIHN0eWxlc2hlZXQgaW5jbHVkaW5nIGl0c2VsZiEKLQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBpbmNsdWRlLmdldEF0dHJpYnV0ZSgiaHJlZiIpLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DSVJDVUxBUl9SRUYpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfNik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkvL2ltcG9ydHMKLQkJZm9yIChJbmNsdWRlIGluY2x1ZGUgOiBzdHlsZXNoZWV0Q29tcG9zZWQuZ2V0U3R5bGVzaGVldCgpLmdldEltcG9ydHMoKSkKLQkJewotCQkJSUZpbGUgaW5jbHVkZWRGaWxlID0gaW5jbHVkZS5nZXRIcmVmQXNGaWxlKCk7Ci0JCQlpZiAoaW5jbHVkZWRGaWxlID09IG51bGwgfHwgIWluY2x1ZGVkRmlsZS5leGlzdHMoKSkKLQkJCXsgLy8gaW5jbHVkZWQgZmlsZSBkb2VzIG5vdCBleGlzdAotCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIGluY2x1ZGUuZ2V0QXR0cmlidXRlKCJocmVmIiksIGdldFByZWZlcmVuY2UoVmFsaWRhdGlvblByZWZlcmVuY2VzLk1JU1NJTkdfSU5DTFVERSksIE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl84ICsgaW5jbHVkZS5nZXRIcmVmKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChpbmNsdWRlZEZpbGUuZXF1YWxzKGluY2x1ZGUuZ2V0U3R5bGVzaGVldCgpLmdldEZpbGUoKSkpCi0JCQl7IC8vIHN0eWxlc2hlZXQgaW5jbHVkaW5nIGl0c2VsZiEKLQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBpbmNsdWRlLmdldEF0dHJpYnV0ZSgiaHJlZiIpLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DSVJDVUxBUl9SRUYpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tUZW1wbGF0ZXMoU3R5bGVzaGVldE1vZGVsIHN0eWxlc2hlZXRDb21wb3NlZCwgWFNMVmFsaWRhdGlvblJlcG9ydCByZXBvcnQpIHRocm93cyBNYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbgotCXsKLQkJZm9yIChUZW1wbGF0ZSB0ZW1wbGF0ZSA6IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRTdHlsZXNoZWV0KCkuZ2V0VGVtcGxhdGVzKCkpCi0JCXsKLQkJCS8vIGNoZWNrIGF0dHJpYnV0ZXMgYXJlIGNvcnJlY3QKLQkJCWlmICh0ZW1wbGF0ZS5nZXROYW1lKCkgIT0gbnVsbCkKLQkJCXsvLyBuYW1lZCB0ZW1wbGF0ZQotLy8JCQkJaWYgKHRlbXBsYXRlLmdldE1hdGNoKCkgIT0gbnVsbCkKLS8vCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCB0ZW1wbGF0ZSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgIlRlbXBsYXRlIGNhbm5vdCBzcGVjaWZ5IGJvdGggbmFtZSBhbmQgbWF0Y2ggYXR0cmlidXRlcyIpOwotLy8JCQkJaWYgKHRlbXBsYXRlLmdldE1vZGUoKSAhPSBudWxsKQotLy8JCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIHRlbXBsYXRlLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCAiTmFtZWQgdGVtcGxhdGVzIGNhbm5vdCBzcGVjaWZ5IGEgbW9kZSIpOwotCQkJCWNoZWNrUGFyYW1ldGVycyhyZXBvcnQsIHRlbXBsYXRlKTsKLQkJCX0gCi0KLQkJCWZvciAoVGVtcGxhdGUgY2hlY2tUZW1wbGF0ZSA6IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRUZW1wbGF0ZXMoKSkKLQkJCXsKLQkJCQlpZiAoY2hlY2tUZW1wbGF0ZSAhPSB0ZW1wbGF0ZSAmJiBjaGVja1RlbXBsYXRlLmVxdWFscyh0ZW1wbGF0ZSkpCi0JCQkJewotCQkJCQlpZiAodGVtcGxhdGUuZ2V0U3R5bGVzaGVldCgpID09IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRTdHlsZXNoZWV0KCkgJiYgY2hlY2tUZW1wbGF0ZS5nZXRTdHlsZXNoZWV0KCkgPT0gc3R5bGVzaGVldENvbXBvc2VkLmdldFN0eWxlc2hlZXQoKSkKLQkJCQkJey8vIHRlbXBsYXRlcyBpbiB0aGlzIHN0eWxlc2hlZXQgY29uZmxpY3Qgd2l0aCBlYWNoIG90aGVyCi0JCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCB0ZW1wbGF0ZSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuVEVNUExBVEVfQ09ORkxJQ1QpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRlbXBsYXRlLmdldFN0eWxlc2hlZXQoKSA9PSBzdHlsZXNoZWV0Q29tcG9zZWQuZ2V0U3R5bGVzaGVldCgpKQotCQkJCQl7Ly8gdGVtcGxhdGUgaW4gaW5jbHVkZWQgc3R5bGVzaGVldCBjb25mbGljdHMgd2l0aCB0aGlzCi0JCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCB0ZW1wbGF0ZSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuVEVNUExBVEVfQ09ORkxJQ1QpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTIpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJey8vIHRlbXBsYXRlcyBpbiBpbmNsdWRlZCBzdHlsZXNoZWV0cyBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIKLQkJCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIHRlbXBsYXRlLmdldFN0eWxlc2hlZXQoKSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuVEVNUExBVEVfQ09ORkxJQ1QpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycyhYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCwgVGVtcGxhdGUgdGVtcGxhdGUpIHRocm93cyBNYXhFcnJvcnNFeGNlZWRlZEV4Y2VwdGlvbgotCXsKLQkJTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4odGVtcGxhdGUuZ2V0UGFyYW1ldGVycygpKTsKLQkJLy8gcmV2ZXJzZSB0aGUgcGFyYW1ldGVycyBvcmRlciBmb3IgY2hlY2tpbmcgLSBmb3IgZHVwbGljYXRlIHBhcmFtZXRlcnMKLQkJLy8gdGhlIGZpcnN0IG9uZSBpcyB2YWxpZAotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHBhcmFtZXRlcnMpOwotCQlTZXQ8UGFyYW1ldGVyPiBkdXBsaWNhdGVQYXJhbWV0ZXJzID0gbmV3IEhhc2hTZXQ8UGFyYW1ldGVyPigpOwotCQkvLyBjaGVjayBwYXJhbWV0ZXJzCi0JCWZvciAoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1ldGVycykKLQkJewotCQkJaWYgKHBhcmFtLmdldE5hbWUoKSA9PSBudWxsKQotCQkJey8vIG5hbWUgaXMgcmVxdWlyZWQKLQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBwYXJhbSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTkFNRV9BVFRSSUJVVEVfTUlTU0lORyksIE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8xNCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJhbS5nZXROYW1lKCkudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQl7Ly8gbmFtZSB2YWx1ZSBpcyByZXF1aXJlZAotCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIHBhcmFtLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5OQU1FX0FUVFJJQlVURV9FTVBUWSksIE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8xNSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChkdXBsaWNhdGVQYXJhbWV0ZXJzLmNvbnRhaW5zKHBhcmFtKSkKLQkJCXsvLyBkb24ndCByZWNoZWNrIHRoZSBwYXJhbWV0ZXIKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsvLyBjaGVjayBhIHBhcmFtZXRlciB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lcyBub3QgZXhpc3QKLQkJCQlmb3IgKFBhcmFtZXRlciBjaGVja1BhcmFtIDogcGFyYW1ldGVycykKLQkJCQl7Ci0JCQkJCWlmIChwYXJhbSAhPSBjaGVja1BhcmFtKQotCQkJCQl7Ci0JCQkJCQlpZiAocGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhjaGVja1BhcmFtLmdldE5hbWUoKSkpCi0JCQkJCQl7Ci0JCQkJCQkJZHVwbGljYXRlUGFyYW1ldGVycy5hZGQoY2hlY2tQYXJhbSk7Ci0JCQkJCQkJY3JlYXRlTWFya2VyKHJlcG9ydCwgcGFyYW0sIGdldFByZWZlcmVuY2UoVmFsaWRhdGlvblByZWZlcmVuY2VzLkRVUExJQ0FURV9QQVJBTUVURVIpLCBNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2FsbFRlbXBsYXRlcyhTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldENvbXBvc2VkLCBYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCkgdGhyb3dzIE1heEVycm9yc0V4Y2VlZGVkRXhjZXB0aW9uCi0JewotCQlmb3IgKENhbGxUZW1wbGF0ZSBjYWxsZWRUZW1wbGF0ZSA6IHN0eWxlc2hlZXRDb21wb3NlZC5nZXRTdHlsZXNoZWV0KCkuZ2V0Q2FsbGVkVGVtcGxhdGVzKCkpCi0JCXsKLQkJCS8vIGdldCB0aGUgbGlzdCBvZiB0ZW1wbGF0ZXMgdGhhdCBtaWdodCBiZSBiZWluZyBjYWxsZWQgYnkgdGhpcwotCQkJLy8gdGVtcGxhdGUgY2FsbAotCQkJTGlzdDxUZW1wbGF0ZT4gdGVtcGxhdGVMaXN0ID0gc3R5bGVzaGVldENvbXBvc2VkLmdldFRlbXBsYXRlc0J5TmFtZShjYWxsZWRUZW1wbGF0ZS5nZXROYW1lKCkpOwotCQkJaWYgKHRlbXBsYXRlTGlzdC5zaXplKCkgPT0gMCkKLQkJCXsKLQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBjYWxsZWRUZW1wbGF0ZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuQ0FMTF9URU1QTEFURVMpLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcy5YU0xWYWxpZGF0b3JfMTgsIGNhbGxlZFRlbXBsYXRlLmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJVGVtcGxhdGUgbmFtZWRUZW1wbGF0ZSA9IHRlbXBsYXRlTGlzdC5nZXQoMCk7Ci0JCQkJZm9yIChQYXJhbWV0ZXIgY2FsbGVkVGVtcGxhdGVQYXJhbSA6IGNhbGxlZFRlbXBsYXRlLmdldFBhcmFtZXRlcnMoKSkKLQkJCQl7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJZm9yIChQYXJhbWV0ZXIgbmFtZWRUZW1wbGF0ZVBhcmFtIDogbmFtZWRUZW1wbGF0ZS5nZXRQYXJhbWV0ZXJzKCkpCi0JCQkJCXsKLQkJCQkJCWlmIChjYWxsZWRUZW1wbGF0ZVBhcmFtLmdldE5hbWUoKS5lcXVhbHMobmFtZWRUZW1wbGF0ZVBhcmFtLmdldE5hbWUoKSkpCi0JCQkJCQl7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWlmICghbmFtZWRUZW1wbGF0ZVBhcmFtLmlzVmFsdWUoKSAmJiAhY2FsbGVkVGVtcGxhdGVQYXJhbS5pc1ZhbHVlKCkpCi0JCQkJCQkJCWNyZWF0ZU1hcmtlcihyZXBvcnQsIGNhbGxlZFRlbXBsYXRlUGFyYW0sIGdldFByZWZlcmVuY2UoVmFsaWRhdGlvblByZWZlcmVuY2VzLkVNUFRZX1BBUkFNKSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzIwLCBjYWxsZWRUZW1wbGF0ZVBhcmFtLmdldE5hbWUoKSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghZm91bmQpCi0JCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBjYWxsZWRUZW1wbGF0ZVBhcmFtLmdldEF0dHJpYnV0ZSgibmFtZSIpLCBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NSVNTSU5HX1BBUkFNKSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWVzc2FnZXMuWFNMVmFsaWRhdG9yXzIyLCBjYWxsZWRUZW1wbGF0ZVBhcmFtLmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NSVNTSU5HX1BBUkFNKSA+IElNYXJrZXIuU0VWRVJJVFlfSU5GTykKLQkJCQl7Ci0JCQkJCWZvciAoUGFyYW1ldGVyIG5hbWVkVGVtcGxhdGVQYXJhbSA6IG5hbWVkVGVtcGxhdGUuZ2V0UGFyYW1ldGVycygpKQotCQkJCQl7Ci0JCQkJCQlpZiAoIW5hbWVkVGVtcGxhdGVQYXJhbS5pc1ZhbHVlKCkpCi0JCQkJCQl7Ci0JCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJCWZvciAoUGFyYW1ldGVyIGNhbGxlZFRlbXBsYXRlUGFyYW0gOiBjYWxsZWRUZW1wbGF0ZS5nZXRQYXJhbWV0ZXJzKCkpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoY2FsbGVkVGVtcGxhdGVQYXJhbS5nZXROYW1lKCkuZXF1YWxzKG5hbWVkVGVtcGxhdGVQYXJhbS5nZXROYW1lKCkpKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJCQljcmVhdGVNYXJrZXIocmVwb3J0LCBjYWxsZWRUZW1wbGF0ZSwgZ2V0UHJlZmVyZW5jZShWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUlTU0lOR19QQVJBTSksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1lc3NhZ2VzLlhTTFZhbGlkYXRvcl8zLCBuYW1lZFRlbXBsYXRlUGFyYW0uZ2V0TmFtZSgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcmtlcihYU0xWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCwgWFNMTm9kZSB4c2xOb2RlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgTWF4RXJyb3JzRXhjZWVkZWRFeGNlcHRpb24KLQl7Ci0JCWlmIChzZXZlcml0eSA+IElNYXJrZXIuU0VWRVJJVFlfSU5GTykKLQkJewotCQkJaWYgKHJlcG9ydC5nZXRFcnJvcnMoKS5zaXplKCkgKyByZXBvcnQuZ2V0V2FybmluZ3MoKS5zaXplKCkgPiBnZXRQcmVmZXJlbmNlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NQVhfRVJST1JTKSkKLQkJCQl0aHJvdyBuZXcgTWF4RXJyb3JzRXhjZWVkZWRFeGNlcHRpb24oKTsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpCi0JCQl7Ci0JCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOgotCQkJCQlyZXBvcnQuYWRkRXJyb3IoeHNsTm9kZSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOgotCQkJCQlyZXBvcnQuYWRkV2FybmluZyh4c2xOb2RlLCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNpbmdsZXRvbiBYU0xWYWxpZGF0b3IgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2luZ2xlc29uIFhTTFZhbGlkYXRvciBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNMVmFsaWRhdG9yIGdldEluc3RhbmNlKCkKLQl7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgWFNMVmFsaWRhdG9yKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzE4OGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMjI0Nzc3IC0gZml4IHNwYWNlcyBpbiBwYXRoIG5hbWVzIGluIFVSSXMuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZyAyMjY1NzggLSByZW1vdmUgZXh0cmFuZW91cyBAb3ZlcnJpZGUgc3RhdGVtZW50cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB3YXMgY2F1c2luZyBjb21waWxhdGlvbiBwcm9ibGVtcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUVuY29kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLlhTTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLlN0eWxlc2hlZXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwubW9kZWwuWFNMQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5YU0xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTTFZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTTFZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGUgWFNMIHZhbGlkYXRvciBleHRlbmRzIHRoZSBYTUwgPGNvZGU+QWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I8L2NvZGU+LgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdE5lc3RlZFZhbGlkYXRvcgotewotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIEJVSUxEIFZBTElEQVRJT04gTUVUSE9EUwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JcHJpdmF0ZSBib29sZWFuIGFzWW91VHlwZVZhbGlkYXRpb247Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhbihJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQl7Ci0JCXN1cGVyLmNsZWFuKHByb2plY3QsIHN0YXRlLCBtb25pdG9yKTsKLQkJWFNMQ29yZS5nZXRJbnN0YW5jZSgpLmNsZWFuKHByb2plY3QsbW9uaXRvcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJVmFsaWRhdGlvblJlc3VsdCByZXMgPSBzdXBlci52YWxpZGF0ZShyZXNvdXJjZSwga2luZCwgc3RhdGUsIG1vbml0b3IpOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQl7Ci0JCQlTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldCA9IFhTTENvcmUuZ2V0SW5zdGFuY2UoKS5nZXRTdHlsZXNoZWV0KChJRmlsZSkgcmVzb3VyY2UpOwotCQkJSUZpbGVbXSBkZXBlbmRlbmNpZXMgPSBzdHlsZXNoZWV0LmdldEZpbGVEZXBlbmRlbmNpZXMoKS50b0FycmF5KG5ldyBJRmlsZVswXSk7Ci0JCQlyZXMuc2V0RGVwZW5kc09uKGRlcGVuZGVuY2llcyk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9IAotCi0JCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gQVMgWU9VIFRZUEUgVkFMSURBVElPTiBNRVRIT0RTCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JewotCQlhc1lvdVR5cGVWYWxpZGF0aW9uID0gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlSW5Kb2IoY29udGV4dCwgcmVwb3J0ZXIpOwotCX0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIENPTU1PTiBNRVRIT0RTCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQlwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShmaW5hbCBTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotCXsKLQkJVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBuZXcgVmFsaWRhdGlvblJlcG9ydCgpewotCi0JCQlwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKQotCQkJewotCQkJCXJldHVybiB1cmk7Ci0JCQl9Ci0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIEhhc2hNYXAgZ2V0TmVzdGVkTWVzc2FnZXMoKQotCQkJewotCQkJCXJldHVybiBuZXcgSGFzaE1hcCgpOwotCQkJfQotCi0JCQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotCQkJewotCQkJCXJldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2VbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfX07Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgZW5jVXJpID0gVVJJRW5jb2Rlci5lbmNvZGUodXJpKTsKLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uVVJJKG5ldyBVUkkoZW5jVXJpKSk7Ci0JCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkKLQkJCXsKLQkJCQlJRmlsZSB4c2xGaWxlID0gZmlsZXNbMF07Ci0JCQkJdmFscmVwb3J0ID0gWFNMVmFsaWRhdG9yLmdldEluc3RhbmNlKCkudmFsaWRhdGUoeHNsRmlsZSxhc1lvdVR5cGVWYWxpZGF0aW9uKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTENvcmVQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTENvcmVQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiB2YWxyZXBvcnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSwgSU1lc3NhZ2UgbWVzc2FnZSkKLQl7Ci0JCVhTTFZhbGlkYXRpb25NZXNzYWdlIG1zZyA9IChYU0xWYWxpZGF0aW9uTWVzc2FnZSkgdmFsaWRhdGlvbk1lc3NhZ2U7Ci0JCVhTTE5vZGUgbm9kZSA9IG1zZy5nZXROb2RlKCk7Ci0JCS8vIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IFhTTE5vZGUuQVRUUklCVVRFX05PREUpCi0JCXsKLQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKCJFUlJPUl9TSURFIiwgIkVSUk9SX1NJREVfUklHSFQiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQltZXNzYWdlLnNldEF0dHJpYnV0ZShDT0xVTU5fTlVNQkVSX0FUVFJJQlVURSwgbmV3IEludGVnZXIodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX1NFTEVDVElPTl9TVFJBVEVHWV9BVFRSSUJVVEUsICJBVFRSSUJVVEVfVkFMVUUiKTsgLy8gd2hldGhlciB0byBzcXVpZ2dsZSB0aGUgZWxlbWVudCwgYXR0cmlidXRlIG9yIHRleHQgLy8kTk9OLU5MUy0xJAotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUsICgoWFNMQXR0cmlidXRlKSBub2RlKS5nZXROYW1lKCkpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBYU0xOb2RlLkVMRU1FTlRfTk9ERSkKLQkJewotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoIkVSUk9SX1NJREUiLCAiRVJST1JfU0lERV9SSUdIVCIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFLCBuZXcgSW50ZWdlcih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgIlNUQVJUX1RBRyIpOyAvLyB3aGV0aGVyIHRvIHNxdWlnZ2xlIHRoZSBlbGVtZW50LCBhdHRyaWJ1dGUgb3IgdGV4dCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDU2N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5YU0xDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5TdHlsZXNoZWV0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWFNMVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWFNMVmFsaWRhdG9yOwotCi0vKioKLSAqIFZhbGlkYXRvciBmb3IgYm90aCBidWlsZCB2YWxpZGF0aW9uIChBYnN0cmFjdFZhbGlkYXRvcikgYW5kIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gKElWYWxpZGF0b3JKb2IpLgotICogCi0gKiBAYXV0aG9yIERvdWcKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvcjIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IKLXsKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBCVUlMRCBWQUxJREFUSU9OIE1FVEhPRFMKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFuKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJWFNMQ29yZS5nZXRJbnN0YW5jZSgpLmNsZWFuKHByb2plY3QsIG1vbml0b3IpOwotCQlzdXBlci5jbGVhbihwcm9qZWN0LCBzdGF0ZSwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JewotCQkvKgotCQkgKiBTdHJpbmcgczsgc3dpdGNoKGtpbmQpIHsgY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDogcyA9ICJhZGRlZCI7IGJyZWFrOyBjYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6IHMgPSAiQ0hBTkdFRCI7IGJyZWFrOyBjYXNlIElSZXNvdXJjZURlbHRhLkNPTlRFTlQ6IHMgPSAiQ09OVEVOVCI7IGJyZWFrOyBjYXNlCi0JCSAqIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6IHMgPSAiUkVNT1ZFRCI7IGJyZWFrOyBkZWZhdWx0OiBzID0gIm90aGVyIjsgfSBTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0JCSAqLwotCQlWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCXsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpcmVzb3VyY2U7Ci0JCQlWYWxpZGF0aW9uUmVwb3J0IHJlcG9ydCA9IGRvVmFsaWRhdGlvbihmaWxlLCBraW5kLCBzdGF0ZSwgbW9uaXRvcik7Ci0JCQlTdHlsZXNoZWV0TW9kZWwgc3R5bGVzaGVldCA9IFhTTENvcmUuZ2V0SW5zdGFuY2UoKS5nZXRTdHlsZXNoZWV0KGZpbGUpOwotCQkJSUZpbGVbXSBkZXBlbmRlbmNpZXMgPSBzdHlsZXNoZWV0LmdldEZpbGVEZXBlbmRlbmNpZXMoKS50b0FycmF5KG5ldyBJRmlsZVswXSk7Ci0JCQlyZXN1bHQuc2V0RGVwZW5kc09uKGRlcGVuZGVuY2llcyk7Ci0JCQkKLQkJCWZvciAoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA6IHJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKSkKLQkJCXsKLQkJCQlYU0xWYWxpZGF0aW9uTWVzc2FnZSB4c2xNc2cgPSAoWFNMVmFsaWRhdGlvbk1lc3NhZ2UpbWVzc2FnZTsKLQkJCQlWYWxpZGF0b3JNZXNzYWdlIG1zZyA9IFZhbGlkYXRvck1lc3NhZ2UuY3JlYXRlKG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCByZXNvdXJjZSk7Ci0JCQkJbXNnLnNldEF0dHJpYnV0ZSgibGluZU51bWJlciIsIHhzbE1zZy5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCW1zZy5zZXRBdHRyaWJ1dGUoInNldmVyaXR5IiwgeHNsTXNnLmdldFNldmVyaXR5KCkpOwotCQkJCXJlc3VsdC5hZGQobXNnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgVmFsaWRhdGlvblJlcG9ydCBkb1ZhbGlkYXRpb24oSUZpbGUgZmlsZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCXsKLQkJVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCQl0cnkKLQkJewotCQkJdmFscmVwb3J0ID0gWFNMVmFsaWRhdG9yLmdldEluc3RhbmNlKCkudmFsaWRhdGUoZmlsZSx0cnVlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xDb3JlUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gdmFscmVwb3J0OwotCX0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIEFTIFlPVSBUWVBFIFZBTElEQVRJT04gTUVUSE9EUwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKQotCXsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLQl7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0JewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0JewotCQl2YWxpZGF0ZUluSm9iKGhlbHBlcixyZXBvcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjYWJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVhTTFZhbGlkYXRvcl8xPVhwYXRoIGlzIGludmFsaWQKLVhTTFZhbGlkYXRvcl8xMD1BIHN0eWxlc2hlZXQgbXVzdCBub3QgaW1wb3J0IGl0c2VsZgotWFNMVmFsaWRhdG9yXzExPVRlbXBsYXRlIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgdGVtcGxhdGUgaW4gdGhpcyBzdHlsZXNoZWV0Ci1YU0xWYWxpZGF0b3JfMTI9VGVtcGxhdGUgY29uZmxpY3RzIHdpdGggYW4gaW5jbHVkZWQgdGVtcGxhdGUKLVhTTFZhbGlkYXRvcl8xMz1JbmNsdWRlZCB0ZW1wbGF0ZXMgY29uZmxpY3Qgd2l0aCBlYWNoIG90aGVyCi1YU0xWYWxpZGF0b3JfMTQ9TmFtZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQKLVhTTFZhbGlkYXRvcl8yMz1ocmVmIGF0dHJpYnV0ZSBpcyByZXF1aXJlZAotWFNMVmFsaWRhdG9yXzE1PU5hbWUgbXVzdCBiZSBzcGVjaWZpZWQKLVhTTFZhbGlkYXRvcl8xNj1QYXJhbWV0ZXIgYWxyZWFkeSBkZWZpbmVkCi1YU0xWYWxpZGF0b3JfMTg9TmFtZWQgdGVtcGxhdGUgJ3swfScgaXMgbm90IGF2YWlsYWJsZQotWFNMVmFsaWRhdG9yXzI9SW5jbHVkZWQgc3R5bGVzaGVldHMgZm9ybSBhIGNpcmN1bGFyIHJlZmVyZW5jZQotWFNMVmFsaWRhdG9yXzIwPVBhcmFtZXRlciB7MH0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUKLVhTTFZhbGlkYXRvcl8yMj1QYXJhbWV0ZXIgezB9IGRvZXMgbm90IGV4aXN0Ci1YU0xWYWxpZGF0b3JfMz1NaXNzaW5nIHBhcmFtZXRlcjogezB9Ci1YU0xWYWxpZGF0b3JfND1NaXNzaW5nIGluY2x1ZGU6IAotWFNMVmFsaWRhdG9yXzY9QSBzdHlsZXNoZWV0IG11c3Qgbm90IGluY2x1ZGUgaXRzZWxmCi1YU0xWYWxpZGF0b3JfOD1NaXNzaW5nIGltcG9ydDogCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3hpbmNsdWRlL1hJbmNsdWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC94aW5jbHVkZS9YSW5jbHVkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkODNjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3hpbmNsdWRlL1hJbmNsdWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogQ29weXJpZ2h0IChjKSAyMDA4IExhcnMgVm9nZWwgDQotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbHYxMC5odG1sDQotKg0KLSogQ29udHJpYnV0b3JzOg0KLSogTGFycyBWb2dlbCAtIExhcnMuVm9nZWxAZ21haWwuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotKiBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIxNzkxOSAtIHJlbmFtZWQgdG8gWEluY2x1ZGVyIGZyb20gTXlYSW5jbHVkZXINCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZmVhdHVyZSBjYWxsIHRvIG1ha2Ugc3VyZSB3ZSBnZXQNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gWEluY2x1ZGUgYXdhcmUgY29uZmlndXJhdGlvbi4gIEFsc28NCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBEb2Nib29rIERURCBoYXJkIGNvZGluZy4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnhpbmNsdWRlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotDQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50Ow0KLQ0KLS8qKg0KLSAqIFhJbmNsdWRlciB3aWxsIHJlYWQgYW4gWE1MIGZpbGUsIHRoYXQgaGFzIGVsZW1lbnRzIGZyb20gdGhlIFhJbmNsdWRlDQotICogbmFtZXNwYWNlIGFuZCBmb2xsb3dzIHRoZSBXM0MgWEluY2x1ZGUgc3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy53My5vcmcvVFIveGluY2x1ZGUvKS4NCi0gKiBJdCB3aWxsIG91dHB1dCBhIG1lcmdlZCBmaWxlLg0KLSAqIEBhdXRob3IgTGFycyBWb2dlbA0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFhJbmNsdWRlciB7DQotDQotCS8qKg0KLQkgKiBleHRyYWNYTUxGaWxlIG1lcmdlcyB0aGUgZmlsZXMgcmVmZXJlbmNlZCBieSB4aW5jbHVkZSBpbmNsdWRlIGVsZW1lbnRzLg0KLQkgKiBAcGFyYW0gaW4gIFRoZSBmdWxsIHBhdGggdG8gdGhlIGlucHV0IFhNTCBmaWxlDQotCSAqIEBwYXJhbSBvdXQgVGhlIGZ1bGwgcGF0aCB0byB0aGUgbWVyZ2VkIFhNTCBmaWxlDQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBleHRyYWN0WE1MRmlsZShTdHJpbmcgaW4sIFN0cmluZyBvdXQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOw0KLQkJRmlsZSBmaWxlOw0KLQ0KLQkJZmlsZSA9IG5ldyBGaWxlKGluKTsNCi0JCWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7DQotCQlmaWxlLmxhc3RNb2RpZmllZCgpOw0KLQkJDQotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JCQ0KLQkJLy8gTWFrZSBzdXJlIHdlIGFyZSBnZXR0aW5nIGEgY29uZmlndXJhdGlvbiB0aGF0IGlzIFhJbmNsdWRlIEF3YXJlDQotCQlkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMveGluY2x1ZGUiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJA0KLQkJZGJmLnNldFhJbmNsdWRlQXdhcmUodHJ1ZSk7DQotCQlkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7DQotDQotCQkNCi0JCURvY3VtZW50QnVpbGRlciBkb20gPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQotCQlkb2N1bWVudCA9IGRvbS5wYXJzZShmaWxlKTsNCi0JCQ0KLQkJLy8gLS0tLSBVc2UgYSBYU0xUIHRyYW5zZm9ybWVyIGZvciB3cml0aW5nIHRoZSBuZXcgWE1MIGZpbGUgLS0tLQ0KLQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKQ0KLQkJCQkubmV3VHJhbnNmb3JtZXIoKTsNCi0JCQ0KLQkJRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpOw0KLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKG91dCkpOw0KLQkJU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3MpOw0KLQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL3Jlc29sdmVyL1Jlc29sdmVyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL3Jlc29sdmVyL1Jlc29sdmVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZWY1ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9yZXNvbHZlci9SZXNvbHZlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSmVzcGVyIFN0ZWVuIE1vZWxsZXIgYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBKZXNwZXIgU3RlZW4gTW9lbGxlciAtIFhTTCBjb3JlIHBsdWdpbgotICogRG91ZyBTYXRjaHdlbGwgLSBidWcgMjI1MzA0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlhTTENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5YU0xDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFRPRE86IEphdmFkb2MKLSAqIAotICogQGF1dGhvciBKZXNwZXIgU3RlZW4gTW9lbGxlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvbHZlckV4dGVuc2lvbiBpbXBsZW1lbnRzIFVSSVJlc29sdmVyRXh0ZW5zaW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRG91YmxlIERFRkFVTFRfWFNMVF9WRVJTSU9OID0gMS4wOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYU0xUX1NUWUxFU0hFRVQgPSAic3R5bGVzaGVldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMVF9URU1QTEFURSA9ICJ0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMVF9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGlzZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgeHNsdF8xXzBfZmlsZVVSTDsKLQlwcml2YXRlIFN0cmluZyB4c2x0XzJfMF9maWxlVVJMOwotCi0JcHVibGljIFN0cmluZyByZXNvbHZlKElGaWxlIGZpbGUsIFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCXsKLQotCQkvLyBJcyBzb21lb25lIGxvb2tpbmcgZm9yICJvdXIiIHNjaGVtYT8KLQkJaWYgKCFYU0xDb3JlLlhTTF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhwdWJsaWNJZCkpCi0JCXsKLQkJCS8vIE5vdCB0aGlzIHRpbWUsIHJldHVybiByaWdodCBhd2F5Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJdmVyc2lvbiA9IHBlZWtWZXJzaW9uQXR0cmlidXRlRnJvbVNTRShmaWxlKTsKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkKLQkJCXZlcnNpb24gPSBwZWVrVmVyc2lvbkZyb21GaWxlKGZpbGUsIGJhc2VMb2NhdGlvbik7Ci0KLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCURvdWJsZSB2ZXJzaW9uTnVtYmVyID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCXZlcnNpb25OdW1iZXIgPSBEb3VibGUudmFsdWVPZih2ZXJzaW9uKTsKLQkJfQotCQljYXRjaCAoVGhyb3dhYmxlIHQpCi0JCXsKLQkJCS8vIE5vdCBpbnRlcmVzdGVkCi0JCX0KLQotCQlpZiAodmVyc2lvbk51bWJlciA9PSBudWxsKQotCQl7Ci0JCQl2ZXJzaW9uTnVtYmVyID0gREVGQVVMVF9YU0xUX1ZFUlNJT047Ci0JCX0KLQotCQkvLyBXZSBjYXJlbGVzc2x5IGRpdGNoIHRoZSBmcmFjdGlvbiBwYXJ0Ci0JCWludCBpbnRWZXJzaW9uID0gdmVyc2lvbk51bWJlci5pbnRWYWx1ZSgpOwotCQljaGVja0luaXRpYWxpc2VkKCk7Ci0JCWlmIChpbnRWZXJzaW9uID09IDEpCi0JCXsKLQkJCXJldHVybiB4c2x0XzFfMF9maWxlVVJMOwotCQl9Ci0JCWVsc2UgaWYgKGludFZlcnNpb24gPT0gMikKLQkJewotCQkJcmV0dXJuIHhzbHRfMl8wX2ZpbGVVUkw7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSW5pdGlhbGlzZWQoKQotCXsKLQkJaWYgKCFpbml0aWFsaXNlZCkKLQkJewotCQkJaW5pdGlhbGlzZWQgPSB0cnVlOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJVVJMIHBsdWdpblVSTCA9IEZpbGVMb2NhdG9yLmZpbmQoWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCksIG5ldyBQYXRoKCIveHNsdC1zY2hlbWFzL3hzbHQtMS4wLnhzZCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXhzbHRfMV8wX2ZpbGVVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwocGx1Z2luVVJMKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCXBsdWdpblVSTCA9IEZpbGVMb2NhdG9yLmZpbmQoWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCksIG5ldyBQYXRoKCIveHNsdC1zY2hlbWFzL3hzbHQtMi4wLnhzZCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXhzbHRfMl8wX2ZpbGVVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwocGx1Z2luVVJMKS50b0V4dGVybmFsRm9ybSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJWFNMQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwZWVrVmVyc2lvbkZyb21GaWxlKElGaWxlIGZpbGUsIFN0cmluZyBiYXNlTG9jYXRpb24pCi0JewotCQlYU0xWZXJzaW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IFhTTFZlcnNpb25IYW5kbGVyKCk7Ci0JCXRyeQotCQl7Ci0JCQloYW5kbGVyLnBhcnNlQ29udGVudHMoZmlsZSAhPSBudWxsID8gY3JlYXRlSW5wdXRTb3VyY2UoZmlsZSkgOiBjcmVhdGVJbnB1dFNvdXJjZShiYXNlTG9jYXRpb24pKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIHNlKQotCQl7Ci0JCQlYU0xDb3JlUGx1Z2luLmxvZyhzZSk7Ci0JCQkvLyBkcm9wIHRocm91Z2gsIHNpbmNlIHRoaXMgaXMgYWxtb3N0IHRvIGJlIGV4cGVjdGVkCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLQkJewotCQkJWFNMQ29yZVBsdWdpbi5sb2cobmV3IENvcmVFeGNlcHRpb24oWFNMQ29yZVBsdWdpbi5uZXdFcnJvclN0YXR1cygiQ2FuJ3QgcGFyc2UgWFNMIGRvY3VtZW50IiwgaW9lKSkpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBkcm9wIHRocm91Z2gsIHNpbmNlIHRoaXMgaXMgbm90IHJlYWxseSBhIHNob3ctc3RvcHBlcgotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLQkJewotCQkJLy8gc29tZSBiYWQgdGhpbmcgaGFwcGVuZWQgLSBmb3JjZSB0aGlzIGRlc2NyaWJlciB0byBiZSBkaXNhYmxlZAotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5YU0xDb3JlUGx1Z2luX3BhcnNlckNvbmZpZ3VyYXRpb247Ci0JCQlYU0xDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhTTENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBtZXNzYWdlLCBwY2UpKTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQkJLy8gZHJvcCB0aHJvdWdoLCBzaW5jZSB0aGlzIGlzIG5vdCByZWFsbHkgYSBzaG93LXN0b3BwZXIKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLQkJewotCQkJWFNMQ29yZVBsdWdpbi5sb2coY2UpOwotCQkJLy8gZHJvcCB0aHJvdWdoLCBzaW5jZSB0aGlzIGlzIG5vdCByZWFsbHkgYSBzaG93LXN0b3BwZXIKLQkJfQotCi0JCVN0cmluZyB2ZXJzaW9uWCA9IGhhbmRsZXIuZ2V0VmVyc2lvbkF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gdmVyc2lvblg7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcGVla1ZlcnNpb25BdHRyaWJ1dGVGcm9tU1NFKElGaWxlIGZpbGUpCi0JewotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCi0JCWlmIChtYW5hZ2VyICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZyBpZCA9IG1hbmFnZXIuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JCQl0cnkKLQkJCXsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpCi0JCQkJewotCQkJCQlEb2N1bWVudCBkb2MgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCWlmIChkb2MgIT0gbnVsbCAmJiBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCQlpZiAoWFNMVF9TVFlMRVNIRUVULmVxdWFscyhkb2N1bWVudEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpIHx8IFhTTFRfVEVNUExBVEUuZXF1YWxzKGRvY3VtZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpCi0JCQkJCQl7Ci0JCQkJCQkJcmV0dXJuIGRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNMVF9WRVJTSU9OKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkKLQkJCXsKLQkJCQkvLyBidWcgMjI1MzA0Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSW5wdXRTb3VyY2UgY3JlYXRlSW5wdXRTb3VyY2UoU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShzeXN0ZW1JZCk7Ci0JfQotCi0JcHJpdmF0ZSBJbnB1dFNvdXJjZSBjcmVhdGVJbnB1dFNvdXJjZShJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSW5wdXRTb3VyY2Ugc3JjID0gbmV3IElucHV0U291cmNlKGZpbGUuZ2V0Q29udGVudHMoKSk7Ci0JCXNyYy5zZXRTeXN0ZW1JZChmaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBzcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9yZXNvbHZlci9YU0xWZXJzaW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9yZXNvbHZlci9YU0xWZXJzaW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFmOTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvcmVzb2x2ZXIvWFNMVmVyc2lvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEplc3BlciBTdGVlbiBN77+9bGxlciAtIGFkYXB0ZWQgZnJvbSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbnRlbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5yZXNvbHZlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5YU0xDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQSBzaW1wbGUgWE1MIHBhcnNlciB0byBmaW5kIHRoZSBYU0wgdmVyc2lvbiBvZiBhIGdpdmVuIFhNTCBmaWxlLCBleHBlY3RlZGx5IGEgWFNMVCBzdHlsZXNoZWV0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWFNMVmVyc2lvbkhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIExleGljYWxIYW5kbGVyLCBFcnJvckhhbmRsZXIgewotCS8qKgotCSAqIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcnNpbmcgc2hvdWxkIHN0b3AuIFRoaXMgaXMgdXN1YWxseQotCSAqIHRyaWdnZXJlZCB3aGVuIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBoYXMgYmVlbiBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTdG9wUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBBbGwgc2VyaWFsaXphYmxlIG9iamVjdHMgc2hvdWxkIGhhdmUgYSBzdGFibGUgc2VyaWFsVmVyc2lvblVJRAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U3RvcFBhcnNpbmdFeGNlcHRpb248L2NvZGU+IHdpdGggYQotCQkgKiA8Y29kZT5udWxsPC9jb2RlPiBkZXRhaWwgbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBTdG9wUGFyc2luZ0V4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKChTdHJpbmcpIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTFRfU1RZTEVTSEVFVCA9ICJzdHlsZXNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTFRfVEVNUExBVEUgPSAidGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMVF9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgdmVyc2lvbiBhdHRyaWJ1dGUgaW4gdGhlIFhTTFQgZmlsZS4KLQkgKiBUaGlzIG1lbWJlciB2YXJpYWJsZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB1bmxlc3MgdGhlIGZpbGUgaGFzIGJlZW4KLQkgKiBwYXJzZWQgc3VjY2Vzc2Z1bCB0byB0aGUgcG9pbnQgb2YgZmluZGluZyB0aGUgdG9wLWxldmVsIGVsZW1lbnQsCi0JICogYW5kIGxvY2F0aW5nIHRoZSAndmVyc2lvbicgYXR0cmlidXRlIHRoZXJlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb25BdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFkb2MKLQkgKi8KLQlwdWJsaWMgWFNMVmVyc2lvbkhhbmRsZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjY29tbWVudChjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbW1lbnQoZmluYWwgY2hhcltdIGNoLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBsZW5ndGgpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBTQVggcGFyc2VyIGZvciB1c2Ugd2l0aGluIHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBwYXJzZXIuCi0JICogCi0JICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgYSBwYXJzZXIgb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNyZWF0ZWQuCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiBzb21ldGhpbmcgaW4gZ2VuZXJhbCBnb2VzIHdyb25nIHdoZW4gY3JlYXRpbmcgdGhlIHBhcnNlci4KLQkgKiBAdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgPGNvZGU+WE1MUmVhZGVyPC9jb2RlPiBkb2VzIG5vdCByZWNvZ25pemUgdGhlCi0JICogICAgICAgICAgICAgbGV4aWNhbCBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgotCSAqIEB0aHJvd3MgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIDxjb2RlPlhNTFJlYWRlcjwvY29kZT4gZG9lcyBub3Qgc3VwcG9ydCB0aGUgbGV4aWNhbAotCSAqICAgICAgICAgICAgIGhhbmRsZXIgY29uZmlndXJhdGlvbiBvcHRpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTQVhQYXJzZXIgY3JlYXRlUGFyc2VyKFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgcGFyc2VyLgotCQlmaW5hbCBTQVhQYXJzZXIgcGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJZmluYWwgWE1MUmVhZGVyIHJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkJcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQlyZWFkZXIuc2V0RXJyb3JIYW5kbGVyKHRoaXMpOyAvLyBUaGlzIGhlbHBzIHRvIGlnbm9yZSBlcnJvcnMKLQkJLy8gZGlzYWJsZSBEVEQgdmFsaWRhdGlvbgotCQl0cnkgewotCQkJLy8JYmUgc3VyZSB2YWxpZGF0aW9uIGlzICJvZmYiIG9yIHRoZSBmZWF0dXJlIHRvIGlnbm9yZSBEVEQncyB3aWxsIG5vdCBhcHBseQotCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL25vbnZhbGlkYXRpbmcvbG9hZC1leHRlcm5hbC1kdGQiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub3QgYSBiaWcgZGVhbCBpZiB0aGUgcGFyc2VyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgZmVhdHVyZXMKLQkJfSBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vdCBhIGJpZyBkZWFsIGlmIHRoZSBwYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZmVhdHVyZXMKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZENEQVRBKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBlbmRDREFUQSgpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kRFREKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBlbmREVEQoKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGVuZEVudGl0eShmaW5hbCBTdHJpbmcgbmFtZSkgewotCQkvLyBOb3QgaW50ZXJlc3RlZC4KLQl9Ci0KLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YWRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25BdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB2ZXJzaW9uQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhZG9jCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHBhcnNlQ29udGVudHMoSW5wdXRTb3VyY2UgY29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJLy8gUGFyc2UgdGhlIGZpbGUgaW50byB3ZSBoYXZlIHdoYXQgd2UgbmVlZCAob3IgYW4gZXJyb3Igb2NjdXJzKS4KLQkJdHJ5IHsKLQkJCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFhTTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZhY3RvcnkoKTsKLQkJCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZmluYWwgU0FYUGFyc2VyIHBhcnNlciA9IGNyZWF0ZVBhcnNlcihmYWN0b3J5KTsKLQkJCS8vIHRvIHN1cHBvcnQgZXh0ZXJuYWwgZW50aXRpZXMgc3BlY2lmaWVkIGFzIHJlbGF0aXZlIFVSSXMgKHNlZSBidWcgNjMyOTgpCi0JCQlwYXJzZXIucGFyc2UoY29udGVudHMsIHRoaXMpOwotCQl9IGNhdGNoIChTdG9wUGFyc2luZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBYm9ydCB0aGUgcGFyc2luZyBub3JtYWxseS4gRmFsbCB0aHJvdWdoLi4uCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBSZXNvbHZlIGV4dGVybmFsIGVudGl0eSBkZWZpbml0aW9ucyB0byBhbiBlbXB0eSBzdHJpbmcuICBUaGlzIGlzIHRvIHNwZWVkCi0JICogdXAgcHJvY2Vzc2luZyBvZiBmaWxlcyB3aXRoIGV4dGVybmFsIERURHMuICBOb3QgcmVzb2x2aW5nIHRoZSBjb250ZW50cyAKLQkgKiBvZiB0aGUgRFREIGlzIG9rLCBhcyBvbmx5IHRoZSBTeXN0ZW0gSUQgb2YgdGhlIERURCBkZWNsYXJhdGlvbiBpcyB1c2VkLgotCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoIiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0Q0RBVEEoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0Q0RBVEEoKSB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0RFREKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0RFREKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgcHVibGljSWQsIGZpbmFsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0RWxlbWVudChmaW5hbCBTdHJpbmcgdXJpLCBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyBxdWFsaWZpZWROYW1lLCBmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAodXJpLmVxdWFscyhYU0xDb3JlLlhTTF9OQU1FU1BBQ0VfVVJJKSAmJiAoWFNMVF9URU1QTEFURS5lcXVhbHMoZWxlbWVudE5hbWUpIHx8IFhTTFRfU1RZTEVTSEVFVC5lcXVhbHMoZWxlbWVudE5hbWUpKSkgewotCQkJdmVyc2lvbkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoWFNMVF9WRVJTSU9OKTsKLQkJfSBlbHNlIHsKLQkJCXZlcnNpb25BdHRyaWJ1dGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRocm93IG5ldyBTdG9wUGFyc2luZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0RW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc3RhcnRFbnRpdHkoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJLy8gTm90IGludGVyZXN0ZWQuCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIE5vdCBpbnRlcmVzdGVkLgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hTTERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YU0xEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWE4MTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hTTERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhTTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWFNMOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhbiBYU0wgZmlsZSBhbmQgY3JlYXRlcyBhbiBYTUwgU3RydWN0dXJlZCBNb2RlbC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWFNMRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQotCXB1YmxpYyBYU0xEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhTTCgpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBuZXcgWFNMU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBieSBkZWZhdWx0LCBVVEYtOCBhcyBwZXIgWE1MIHNwZWMKLQkJZmluYWwgU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihuZXcgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFhTTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yWFNMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yWFNMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1MmE4MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhTTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLlhNTE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YU0xEb2N1bWVudExvYWRlcjsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGdlbmVyaWMgWE1MIG1vZGVsIGhhbmRsaW5nLiBJdCBpcyBhbHNvIG1hcmtlZCBhcyB0aGUgZGVmYXVsdAotICogY29udGVudCB0eXBlIGhhbmRsZXIuIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGRlZmF1bHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JYU0wgZXh0ZW5kcyBNb2RlbEhhbmRsZXJGb3JYTUwgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSBYU0xDb3JlLlhTTF9DT05URU5UX1RZUEU7Ci0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JYU0woKSB7Ci0JCXN1cGVyKCk7CQotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IFhTTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBYU0xNb2RlbExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1hTTE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvWFNMTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDk2ZjVkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvWFNMTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkRlYnVnQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5YTUxNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YU0xEb2N1bWVudExvYWRlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xNb2RlbExvYWRlciBleHRlbmRzIFhNTE1vZGVsTG9hZGVyIHsKLQotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJfRU5DT0RJTkcgPSAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUxMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWFNMTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0vLwlAT3ZlcnJpZGUKLS8vCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0vLwkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLS8vCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpOwotLy8JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0vLwkJLy8gRG9lcyBYTUwgbmVlZCBwcm9wYWdhdGluZyBhZGFwdGVyPyBPciBqdXN0IEpTUD8KLS8vCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0vLwkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBYU0xEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWFNMTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBET01Nb2RlbEltcGwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJc3VwZXIucHJlTG9hZEFkYXB0KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cykgewotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3BhcnNlci9YU0xTb3VyY2VQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3BhcnNlci9YU0xTb3VyY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0NmE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9wYXJzZXIvWFNMU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFhTTFNvdXJjZVBhcnNlciBleHRlbmRzIFhNTFNvdXJjZVBhcnNlciB7Ci0KLQotCXB1YmxpYyBYU0xTb3VyY2VQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhTTFNvdXJjZVBhcnNlciBuZXdJbnN0YW5jZSA9IG5ldyBYU0xTb3VyY2VQYXJzZXIoKTsKLQkJbmV3SW5zdGFuY2Uuc2V0VG9rZW5pemVyKGdldFRva2VuaXplcigpLm5ld0luc3RhbmNlKCkpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFRva2VuaXplcihCbG9ja1Rva2VuaXplciBuZXdUb2tlbml6ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zZXRUb2tlbml6ZXIobmV3VG9rZW5pemVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gdGhlc2UgdHlwZXMgKG1pZ2h0KSBkZW1hbmQgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciBlYWNoCi0JCQkvLyBvZiB0aGVtCi0JCQkKLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJCS8vIG11bHRpcGxlIGJsb2NrIHRleHRzIGluZGljYXRlZCBlbWJlZGRlZCBjb250YWluZXJzOyBubwotCQkJCQkvLyBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3QgY29udGludWluZyBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0Ci0JCQkJCQkvLyB0ZXJtaW5hdGVkCi0JCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCQl9Ci0JCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIE9QRU4gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCWVsc2UgaWYgKChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmlzRW5kZWQoKSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdCB0ZXJtaW5hdGVkCi0JCQkJCWlmICghY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJfQotCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCX0KLQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIG5laXRoZXIgb3BlbiBub3IgY2xvc2UKLQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7IGp1c3QgYWRkIHRvIHRoZW0KLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUKSkgewotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBjbG9zZSBvZmYgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJLy8gY2xlYW5seQotCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQkvLyB0aGlzIGlzIGV4dHJlbWVseSByYXJlLCBidXQgdmFsaWQKLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJLy8gcGFjayB0aGUgZW1iZWRkZWQgY29udGFpbmVyIHdpdGggdGhpcyByZWdpb24KLQkJCQlpZiAobGFzdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbGFzdFJlZ2lvbjsKLQkJCQkJY29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQocmVnaW9uKTsKLQkJCQkJLy8gY29udGFpbmVycyBtdXN0IGhhdmUgcGFyZW50IHNldCAuLi4KLQkJCQkJLy8gc2V0dGluZyBmb3IgRUFDSCBzdWJyZWdpb24gaXMgcmVkdW5kZW50LCBidXQgbm90IHN1cmUKLQkJCQkJLy8gd2hlcmUgZWxzZSB0byBkbywgc28gd2lsbCBkbyBoZXJlIGZvciBub3cuCi0JCQkJCWNvbnRhaW5lci5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY29udGFpbmVyKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGNvbnRhaW5lci5nZXRMZW5ndGgoKSAtIHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gc2tpcCBvbiBhIHZlcnktZmlyc3QgcmVnaW9uIHNpdHVhdGlvbiBhcyB0aGUgZGVmYXVsdAotCQkJCS8vIGJlaGF2aW9yIGlzIGdvb2QgZW5vdWdoCi0JCQkJLy8gY29tYmluZSB3aXRoIHByZXZpb3VzIGlmIGFsc28gdW5kZWZpbmVkCi0JCQkJaWYgKGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJLy8gcHJldmlvdXMgd2Fzbid0IHVuZGVmaW5lZAotCQkJCWVsc2UgewotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaWYgYW4gdW5rbm93biB0eXBlIGlzIHRoZSBmaXJzdCByZWdpb24gaW4gdGhlIGRvY3VtZW50LAotCQkJCS8vIGVuc3VyZSB0aGF0IGEgbm9kZSBleGlzdHMKLQkJCQlpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkgewotCQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQgcmVnaW9uIG9mIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlZCB0eXBlICIgKyByZWdpb24uZ2V0VHlwZSgpICsgIiBAICIgKyByZWdpb24uZ2V0U3RhcnQoKSArICJbIiArIHJlZ2lvbi5nZXRMZW5ndGgoKSArICJdIik7IC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJLy8gdGhlc2UgcmVnaW9ucyBhbHNvIGdldCB0aGVpciBvd24gbm9kZSwgc28gY2xvc2UgdGhlbSBjbGVhbmx5Ci0JCQkvLyBOT1RFOiB0aGVzZSByZWdpb25zIGhhdmUgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgY3JlYXRlZAotCQkJLy8gZm9yIHRoZW0gYWJvdmU7IGl0IG1heQotCQkJLy8gYmUgbW9yZSByZWFkYWJsZSBpZiB0aGF0IGlzIGhhbmRsZWQgaGVyZSBhcyB3ZWxsLCBidXQgdGhlCi0JCQkvLyBjdXJyZW50IGxheW91dAotCQkJLy8gZW5zdXJlcyB0aGF0IHRoZXkgb3BlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHRoZSBzYW1lIHdheQotCQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJfQotCQkvLyBmU3RyaW5nSW5wdXQgPSBudWxsOwotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWFBhdGhTZXBhcmF0b3JSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hQYXRoU2VwYXJhdG9yUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3MTQwNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWFBhdGhTZXBhcmF0b3JSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLlJlZ2lvblRvU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLQotcHVibGljIGNsYXNzIFhQYXRoU2VwYXJhdG9yUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotCXByaXZhdGUgc2hvcnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBYUGF0aFNlcGFyYXRvclJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWFBhdGhTZXBhcmF0b3JSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gKHNob3J0KSBsZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9yZWdpb25zL1hQYXRoUmVnaW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9YUGF0aFJlZ2lvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjQ2ZGI4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC9yZWdpb25zL1hQYXRoUmVnaW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5yZWdpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhQYXRoUmVnaW9uQ29udGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS19URVhUID0gIkJMT0NLX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFRklORUQgPSAiVU5ERUZJTkVEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVfU1BBQ0UgPSAiV0hJVEVfU1BBQ0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYUEFUSF9DT05URU5UID0gIlhQQVRIX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhfU0VQQVJBVE9SX0RJViA9ICJYUEFUSF9TRVBBUkFUT1JfRElWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQQVRIX0ZVTkNUSU9OX1BBUkFNRVRFUlNfT1BFTiA9ICJYUEFUSF9GVU5DVElPTl9QQVJBTUVURVJTX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhfRlVOQ1RJT05fUEFSQU1FVEVSU19DTE9TRSA9ICJYUEFUSF9GVU5DVElPTl9QQVJBTUVURVJTX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQQVRIX0ZVTkNUSU9OX05BTUUgPSAiWFBBVEhfRlVOQ1RJT05fTkFNRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3NyY19zc2Uvb3JnL2VjbGlwc2Uvd3N0L3hzbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvWFNMUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9YU0xQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzExZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9YU0xQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgWFNMUGFyc2VyUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC90ZXh0L0lYU0xQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC90ZXh0L0lYU0xQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4YjFjNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdGV4dC9JWFNMUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24gdHlwZXMgZm9yIFhTTC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAwLjVNNwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYU0xQYXJ0aXRpb25zIHsKLQkKLQlTdHJpbmcgWFNMX1hQQVRIID0gIm9yZy5lY2xpcHNlLndzdC54c2wuWFNMX1hQQVRIIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUvc3JjX3NzZS9vcmcvZWNsaXBzZS93c3QveHNsL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWFNMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYU0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjljZDU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS9zcmNfc3NlL29yZy9lY2xpcHNlL3dzdC94c2wvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYU0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC50ZXh0LklYU0xQYXJ0aXRpb25zOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHNldHRpbmcgdXAgU3RydWN0dXJlZCBEb2N1bWVudCBQYXJ0aW9ucyAKLSAqIGluIFhTTCBkb2N1bWVudHMuIAotICogQGF1dGhvciBkY2FydmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhTTCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVCwgSVhTTFBhcnRpdGlvbnMuWFNMX1hQQVRIfTsKLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWFNMIGFkZHMgdGhlIG5lY2Vzc2FyeQotCSAqIFBhcnRpdGlvbiB0eXBlcyB0byBoZWxwIElkZW50aWZ5IHBvdGVudGlhbCBYUGF0aCBhcmVhcy4KLQkgKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgTGluZSBTdHlsaW5nIGFuZCBDb250ZW50IEFzc2lzdGFuY2UuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYU0woKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQlyZXN1bHQgPSBJWFNMUGFydGl0aW9ucy5YU0xfWFBBVEg7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBjb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveGluY2x1ZGUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hpbmNsdWRlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxY2IzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveGluY2x1ZGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBXM0PCriBTT0ZUV0FSRSBOT1RJQ0UgQU5EIExJQ0VOU0UKLSAqIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCi0gKgotICogQ29weXJpZ2h0IMKpIDE5OTQtMjAwMiBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLSAqIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsCi0gKiBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLwotICoKLSAqIFRoaXMgVzNDIHdvcmsgKGluY2x1ZGluZyBzb2Z0d2FyZSwgZG9jdW1lbnRzLCBvciBvdGhlciByZWxhdGVkIGl0ZW1zKSBpcyBiZWluZwotICogcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLAotICogdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLAotICogdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlCi0gKiBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb24gQUxMIGNvcGllcwotICogb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zLCB0aGF0Ci0gKiB5b3UgbWFrZToKLSAqCi0gKiAgMS4gVGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZSByZWRpc3RyaWJ1dGVkCi0gKiAgICAgb3IgZGVyaXZhdGl2ZSB3b3JrLgotICogIDIuIEFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmQKLSAqICAgICBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCBhIHNob3J0IG5vdGljZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQgYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOiAiQ29weXJpZ2h0IMKpIFskZGF0ZS1vZi1zb2Z0d2FyZV0gV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIgotICogIDMuIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBXM0MgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZSBjaGFuZ2VzCi0gKiAgICAgd2VyZSBtYWRlLiAoV2UgcmVjb21tZW5kIHlvdSBwcm92aWRlIFVSSXMgdG8gdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlIGNvZGUgaXMKLSAqICAgICBkZXJpdmVkLikKLSAqCi0gKiBUSElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUyBNQUtFIE5PIAotICogUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgCi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRgotICogVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsCi0gKiBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KLSAqCi0gKiBDT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTi4KLSAqCi0gKiBUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5Ci0gKiBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodAotICogaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQKLSAqIGhvbGRlcnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICAgICAgICAgZmluYWxEZWZhdWx0PSJleHRlbnNpb24iPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImluY2x1ZGUiIHR5cGU9InhpOmluY2x1ZGVUeXBlIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJpbmNsdWRlVHlwZSIgbWl4ZWQ9InRydWUiPgotICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSd4aTpmYWxsYmFjaycgLz4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPScjI290aGVyJyBwcm9jZXNzQ29udGVudHM9J2xheCcgLz4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPScjI2xvY2FsJyBwcm9jZXNzQ29udGVudHM9J2xheCcgLz4KLSAgICA8L3hzOmNob2ljZT4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHVzZT0ib3B0aW9uYWwiIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFyc2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InhtbCIKLSAgICAgICAgICAgICAgICAgIHR5cGU9InhpOnBhcnNlVHlwZSIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Inhwb2ludGVyIiB1c2U9Im9wdGlvbmFsIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB1c2U9Im9wdGlvbmFsIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFjY2VwdCIgdXNlPSJvcHRpb25hbCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhY2NlcHQtbGFuZ3VhZ2UiIHVzZT0ib3B0aW9uYWwiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9InBhcnNlVHlwZSI+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieG1sIi8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRleHQiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0gIAotICA8eHM6ZWxlbWVudCBuYW1lPSJmYWxsYmFjayIgdHlwZT0ieGk6ZmFsbGJhY2tUeXBlIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJmYWxsYmFja1R5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4aTppbmNsdWRlIi8+Ci0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2xvY2FsIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6Y2hvaWNlPgotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveHNsdC0xLjAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmNvcmUveHNsdC1zY2hlbWFzL3hzbHQtMS4wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NTA0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveHNsdC0xLjAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTY5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgLSBXM0MsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwKLSAqIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSAyMDA3MTIyOCAtIFNUQVIgLSBVcGRhdGVkIHRvIFhNTCBTY2hlbWFzIDIwMDEgMS4wCi0gKiAgICAgICAgIE5vdGUgdGhpcyBzY2hlbWFzIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGZvciBYU0xUIDIuMCwgaXQgaGFzCi0gKiAgICAgICAgIGJlZW4gc3RyaXBwZWQgb2YgYWxsIFhTTFQgMi4wIGFkZGl0aW9ucywgdG8gYnJpbmcgaXQgaW4gbGluZSB3aXRoIHRoZSBYU0xUIDEuMAotICogICAgICAgICBzcGVjaWZpY2F0aW9uLgotICogICAgICAgICBUaGUgb3JpZ2luYWwgdmVyc2lvbiBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3d3dy53My5vcmcvMjAwNy9zY2hlbWEtZm9yLXhzbHQyMC54c2QKLSAqICAgICAgICAgVGhlIG9yaWdpbmFsIFczQyBjb3B5cmlnaHQgbm90aWNlIGlzIGluY2x1ZGVkOgotICogICAgIERhdmlkIENhcnZlciAtIDIwMDgwMzMwIC0gU1RBUiAtIGJ1ZyAyMjQ4MTkgLSBjaGFuZ2VkIHByb2Nlc0NvbnRlbnRzIGZyb20gbGF4IHRvIHNraXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVzNDwq4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFCi0gKiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMAotICoKLSAqIENvcHlyaWdodCDCqSAxOTk0LTIwMDIgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCi0gKiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLAotICogS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KLSAqCi0gKiBUaGlzIFczQyB3b3JrIChpbmNsdWRpbmcgc29mdHdhcmUsIGRvY3VtZW50cywgb3Igb3RoZXIgcmVsYXRlZCBpdGVtcykgaXMgYmVpbmcKLSAqIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UuIEJ5IG9idGFpbmluZywKLSAqIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwKLSAqIHVuZGVyc3Rvb2QsIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZQotICogb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMKLSAqIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgdGhhdAotICogeW91IG1ha2U6Ci0gKgotICogIDEuIFRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUgcmVkaXN0cmlidXRlZAotICogICAgIG9yIGRlcml2YXRpdmUgd29yay4KLSAqICAyLiBBbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IgdGVybXMgYW5kCi0gKiAgICAgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgYSBzaG9ydCBub3RpY2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtIChoeXBlcnRleHQgaXMgcHJlZmVycmVkLCB0ZXh0IGlzIHBlcm1pdHRlZCkgc2hvdWxkIGJlIHVzZWQgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZTogIkNvcHlyaWdodCDCqSBbJGRhdGUtb2Ytc29mdHdhcmVdIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyIKLSAqICAzLiBOb3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgVzNDIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGRhdGUgY2hhbmdlcwotICogICAgIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzCi0gKiAgICAgZGVyaXZlZC4pCi0gKgotICogVEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQgQ09QWVJJR0hUIEhPTERFUlMgTUFLRSBOTyAKLSAqIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8sIAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YKLSAqIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLAotICogVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuCi0gKgotICogQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCi0gKgotICogVGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgY29weXJpZ2h0IGhvbGRlcnMgbWF5IE5PVCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQotICogcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQKLSAqIGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0Ci0gKiBob2xkZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotIC0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiAKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIAotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgPgotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotICAKLSAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0gCi08IS0tCi1UaGUgZGVjbGFyYXRpb24gb2YgeG1sOnNwYWNlIGFuZCB4bWw6bGFuZyBtYXkgbmVlZCB0byBiZSBjb21tZW50ZWQgb3V0IGJlY2F1c2UKLW9mIHByb2JsZW1zIHByb2Nlc3NpbmcgdGhlIHNjaGVtYSB1c2luZyB2YXJpb3VzIHRvb2xzCi0tLT4KLSAgICAgIAotPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgCi0gIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEE6IGRlZmluaXRpb25zIG9mIGNvbXBsZXggdHlwZXMgYW5kIG1vZGVsIGdyb3VwcyB1c2VkIGFzIHRoZSBiYXNpcyAKLSAgICAgICAgICAgIGZvciBlbGVtZW50IGRlZmluaXRpb25zCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmljLWVsZW1lbnQtdHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29sbGF0aW9uIiB0eXBlPSJ4c2w6dXJpLWxpc3QiLz4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIiB0eXBlPSJ4c2w6cHJlZml4LWxpc3Qtb3ItYWxsIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXMiIHR5cGU9InhzbDpwcmVmaXgtbGlzdCIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS13aGVuIiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoLWRlZmF1bHQtbmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb25lZC1lbGVtZW50LXR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmdlbmVyaWMtZWxlbWVudC10eXBlIj4gICAgCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzOmRlY2ltYWwiIHVzZT0ib3B0aW9uYWwiLz4KLQotICAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIiBtaXhlZD0iZmFsc2UiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotCi08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtY29uc3RydWN0b3IiPgotICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPiAgICAKLSAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmdyb3VwIG5hbWU9InNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIj4KLSAgPHhzOmNob2ljZT4KLQotICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnZhcmlhYmxlIi8+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6aW5zdHJ1Y3Rpb24iLz4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6cmVzdWx0LWVsZW1lbnRzIi8+Ci0gIDwveHM6Y2hvaWNlPgotPC94czpncm91cD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZGVjbGFyYXRpb24iIHR5cGU9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSIgYWJzdHJhY3Q9InRydWUiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0iaW5zdHJ1Y3Rpb24iIHR5cGU9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSIvPgotCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotPHhzOmFubm90YXRpb24+Ci0gIDx4czpkb2N1bWVudGF0aW9uPgotCi0gICAgUEFSVCBCOiBkZWZpbml0aW9ucyBvZiBpbmRpdmlkdWFsIFhTTFQgZWxlbWVudHMgICAgCi0gICAgRWxlbWVudHMgYXJlIGxpc3RlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotCi08eHM6ZWxlbWVudCBuYW1lPSJhcHBseS1pbXBvcnRzIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIFRoaXMgY29tbWFuZCBhcHBsaWVzIHRlbXBsYXRlIHJ1bGUgZnJvbSBhbiBpbXBvcnRlZCBzdHlsZSBzaGVldC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSIvPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImFwcGx5LXRlbXBsYXRlcyIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICBBcHBsaWVzIHRlbXBsYXRlIHJ1bGVzIGJhc2VkIG9uIGEgZ2l2ZW4gWFBhdGggc2VsZWN0aW9uIGNyaXRlcmlhLiAgSWYgbm8gdGVtcGxhdGUKLSAgICAgICAgaXMgZm91bmQgdGhlIGJ1aWx0IGluIHRlbXBsYXRlcyBhcmUgdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpzb3J0Ii8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6d2l0aC1wYXJhbSIvPgotICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiBkZWZhdWx0PSJjaGlsZDo6bm9kZSgpIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTcGVjaWZpZXMgdGhlIFhQYXRoIGNyaXRlcmlhIHRvIGJlIHVzZWQgdG8gYXBwbHkgdGhlIHRlbXBsYXRlcy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1vZGUiIHR5cGU9InhzbDptb2RlIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRlbXBsYXRlIHRvIGJlIHVzZWQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuCi0gICAgICAgICAgICAgICAgIG9uZSB3YXkgaW4gd2hpY2ggdG8gcHJvY2VzcyB0aGUgZ2l2ZW4gY3JpdGVyaWEuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgRGVmaW5lcyBhbiBhdHRyaWJ1dGUgdGhhdCB3aWxsIGJlIHB1dCBpbiB0aGUgcmVzdWx0IHNldC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgY3JlYXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHNsOmF2dCI+Ci0gICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4gICAgICAgIAotCi08eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtc2V0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBEZWZpbmVzIGEgZ3JvdXAgb2YgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBhbmQgY2FuIGJlIHJldXNlZAotICAgICAgICAgYnkgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIHN0eWxlc2hlZXQgZHVyaW5nIHByb2Nlc3NpbmcuICBUaGVzZSBhdHRyaWJ1dGVzCi0gICAgICAgICB3aWxsIGFwcGVhciBvbiB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IHdoZW4gdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmF0dHJpYnV0ZSIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgc2V0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiB0eXBlPSJ4c2w6UU5hbWVzIiBkZWZhdWx0PSIiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBhdHRyaWJ1dGVzLXNldHMgc2VwYXJhdGVkIGJ5IHNwYWNlcyB0byBiZSB1c2VkIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBzZXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNhbGwtdGVtcGxhdGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgdGVtcGxhdGUgdG8gYmUgY2FsbGVkLiBBIGNhbGxlZCB0ZW1wbGF0ZQotICAgICAgICBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gaXQgaXMgY2FsbGVkLiAgSXQgaXMgbm90IGV4ZWN1dGVkIGRpcmVjdGx5IGJ5Ci0gICAgICAgIGFuIGFwcGx5LXRlbXBsYXRlcyBjb21tYW5kLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY2hvb3NlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBDaG9vc2UgaXMgdGhlIGJlZ2lubmluZyBvZiBhIFdoZW4vT3RoZXJ3aXNlIGNvbWJpbmF0aW9uLiAgSXQgaXMKLSAgICAgICAgIHRoZSB3YXkgdG8gaW1wbGVtZW50IGNhc2Ugc2VsZWN0aW9uIG9mIElmL1RoZW4vRWxzZUlmIHR5cGUgbG9naWNhbAotICAgICAgICAgcHJvY2Vzc2luZy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aGVuIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm90aGVyd2lzZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb21tZW50IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIENyZWF0ZXMgYSBjb21tZW50IG5vZGUgaW4gdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb3B5IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBDb3B5IGNyZWF0ZXMgYSBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgbm9kZSBiZWluZyBwcm9jZXNzZWQuICBJdAotICAgICAgICAgZG9lcyBub3QgY29weSB0aGUgYXR0cmlidXRlcyBvciBjaGlsZHJlbiBub2Rlcy4gIFNlZSBjb3B5LW9mIGZvcgotICAgICAgICAgY29weWluZyBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlbiBub2Rlcy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1hdHRyaWJ1dGUtc2V0cyIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzIHNldHMgdG8gYXBwbHkgdG8gdGhlCi0gICAgICAgICAgICAgICAgIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY29weS1vZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQ3JlYXRlcyBhIGNvcHktb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGF0dHJpYnV0ZXMsIGFuZCBjaGlsZHJlbiBub2Rlcy4KLSAgICAgICAgIEl0IGNvcGllcyB0aGUgbm9kZXMgc3BlY2lmaWVkIGJ5IHRoZSBYUGF0aCBzZWxlY3Rpb24gY3JpdGVyaWEuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgWFBhdGggZXhwcmVzc2lvbnMgdGhhdCBzZWxlY3QgdGhlIG5vZGVzIHRvIGJlIGNvcGllZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbC1mb3JtYXQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIERlZmluZXMgdGhlIG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCB3aGVuIGNvbnZlcnRpbmcgbnVtYmVycyBpbnRvIHN0cmluZ3Mgd2hlbgotICAgICAgICAgdXNlZCB3aXRoIHRoZSBYUGF0aCBmdW5jdGlvbiBmb3JtYXQtbnVtYmVyKCkuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZvcm1hdC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlY2ltYWwtc2VwYXJhdG9yIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iLiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgY2hhcmFjdGVyIHRvIHVzZSB0byByZXByZXNlbnQgYSBkZWNpbWFsIHBvaW50LgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBwZXJpb2QuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zZXBhcmF0b3IiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSIsIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIHNlcGVyYXRlIHRob3VzYW5kcy4gIFRoZQotICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyBhIGNvbW1hLiAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmZpbml0eSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJJbmZpbml0eSI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBzdHJpbmcgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgaW5maW5pdHkuIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICBpcyBJbmZpbml0eS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbnVzLXNpZ24iIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSItIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCBuZWdhdGl2ZSBudW1iZXJzLgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdGhlIG1pbnVzIHNpZ24uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJOYU4iIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iTmFOIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBzdHJpbmcgdG8gYmUgdXNlZCB3aGVuIHRoZSBpbnB1dCBpcyBOb3QgYSBOdW1iZXIuCi0gICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBOYU4uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwZXJjZW50IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iJSI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgYSBwZXJjZW50LgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgYSBwZXJjZW50IHNpZ24uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwZXItbWlsbGUiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSImI3gyMDMwOyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gcmVwcmVzZXQgcGVyIHRob3VzYW5kLgotICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgJiN4MjAzMDsKLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Inplcm8tZGlnaXQiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSIwIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGlnaXQgemVyby4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRoZSBudW1iZXIgemVyby4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpZ2l0IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iIyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGVkIHdoZXJlIGEgZGlnaXQKLSAgICAgICAgICAgICAgICAgICBpcyByZXF1aXJlZC4gIFRoZSBkZWZhdWx0IHZhbHVlcyBpcyAjIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhdHRlcm4tc2VwYXJhdG9yIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iOyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gc2VwYXJhdGUgcG9zaXRpdmUgYW5kCi0gICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgc3ViLXBhdHRlcm5zIGluIGEgcGF0dGVybi4gIFRoZSBkZWZhdWx0IGlzIGEgc2VtaS1jb2xvbi4gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIENyZWF0ZXMgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBuYW1lc3BhY2UgdGhlIGVsZW1lbnQgYmVsb25ncy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1hdHRyaWJ1dGUtc2V0cyIgdHlwZT0ieHNsOlFOYW1lcyIgZGVmYXVsdD0iIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZS1zZXQgbmFtZXMgdG8gCi0gICAgICAgICAgICAgICAgICAgYmUgaW5jbHVkZWQgb24gdGhlIGVsZW1lbnQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImZhbGxiYWNrIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICBTcGVjaWZpZXMgYWx0ZXJuYXRlIGNvZGUgdG8gYmUgcnVuIGlmIHRoZSBYU0xUIHByb2Nlc3NvciBkb2Vzbid0IHVuZGVyc3RhbmQKLSAgICAgICAgICBhIHBhcnRpY3VsYXIgeHNsIGVsZW1lbnQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJmb3ItZWFjaCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQSBsb29waW5nIGNvbW1hbmQgdGhhdCBwcm9jZXNzZXMgZWFjaCBub2RlIHJldHVybmVkIGZyb20gdGhlCi0gICAgICAgICBYUGF0aCBzZWxlY3Rpb24gY3JpdGVyaWEuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6c29ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgWFBhdGggc2VsZWN0aW9uIGNyaXRlcmlhIHRvIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIG5vZGUgc2V0IHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgbG9vcC4gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQSBsb2dpY2FsIGNvbnN0cnVjdCwgdGhhdCB3aWxsIG9ubHkgYmUgYXBwbGllZCB3aGVuIHRoZSBYUGF0aCBleHByZXNzaW9uCi0gICAgICAgICB0ZXN0IHJldHVybnMgdHJ1ZS4gIEl0IGRvZXMgbm90IHN1cHBvcnQgYSBFbHNlIHN0YXRlbWVudCwgc2VlIENob29zZQotICAgICAgICAgZm9yIGltcGxlbWVudGluZyBJZi9UaGVuL0Vsc2VJZiBsb2dpYy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRlc3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gdGVzdCB0aGUgdmFyaWFibGUgb3Igbm9kZSBhZ2FpbnN0LgotICAgICAgICAgICAgICAgICAgICBUaGUgc3RhdGVtZW50cyBuZXN0ZWQgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIGlmIHRoZSB0ZXN0IHJldHVybnMKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iaW1wb3J0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIEFsbG93cyB0aGUgaW5jbHVzaW9uIG9mIG9uZSBzdHlsZXNoZWV0IGludG8gYW5vdGhlci4gIElmIHRoZXJlIGFyZQotICAgICAgICB0ZW1wbGF0ZXMgdGhhdCBhcmUgdGhlIHNhbWUgaW4gdGhlIHBhcmVudCBzdHlsZXNoZWV0IHRoYXQgYXJlIGluIHRoZQotICAgICAgICBzdHlsZXNoZWV0IGJlaW5nIGltcG9ydGVkLCB0aGUgcGFyZW50IHN0eWxlc2hlZXQncyB0ZW1wbGF0ZXMgd2lsbCAKLSAgICAgICAgdGFrZSBwcmVjZWRlbmNlLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIFVSSSBmb3IgdGhlIHN0eWxlc2hlZXQuICBUaGlzIGlzIGVpdGhlciBhIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgICBvciBwaHlzaWNhbCBVUkkuICBJZiBpdCBpcyByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICBvZiB0aGUgc3R5bGVzaGVldC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotCi08eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBJbmNsdWRlIGJyaW5ncyBpbiBhbm90aGVyIHN0eWxlc2hlZXQgaW50byB0aGUgY3VycmVudCBvbmUuICBVbmxpa2UKLSAgICAgICAgIHRoZSBJbXBvcnQgc3RhdGVtZW50LCB0aGUgc3R5bGVzaGVldCB0ZW1wbGF0ZXMgaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlCi0gICAgICAgICBhcyB0aGUgb25lIGJlaW5nIGluY2x1ZGVkIGluIHRvLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgVVJJIGZvciB0aGUgc3R5bGVzaGVldC4gIFRoaXMgaXMgZWl0aGVyIGEgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgIG9yIHBoeXNpY2FsIFVSSS4gIElmIGl0IGlzIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzdHlsZXNoZWV0LgotICAgICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJrZXkiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgQSBrZXkgaXMgYSB3YXkgdG8gaW5kZXggYSBzZXQgb2Ygbm9kZXMgdG8gYmUgcmV0cmlldmVkIGxhdGVyIGJ5IHRoZSBYUGF0aAotICAgICAgICBrZXkoKSBmdW5jdGlvbi4gIEl0IGFsbG93cyBmYXN0ZXIgYWNjZXNzIHRvIGEgc2VyaWVzIG9mIG5vZGVzIGJhc2VkIG9mZiBvZiBhCi0gICAgICAgIHVuaXF1ZSBrZXkgd2l0aCBpbiBhIGxpc3Qgb2Ygbm9kZXMuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgbmFtZSBvZiB0aGUga2V5IHRvIGJlIGNyZWF0ZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXRjaCIgdHlwZT0ieHNsOnBhdHRlcm4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgRGVmaW5lcyB0aGUgWFBhdGggZXhwcmVzc2lvbiB0byB3aGljaCB0aGUgbm9kZXMgd2lsbAotICAgICAgICAgICAgICAgICAgYmUgYXBwbGllZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgdmFsdWUgb2YgdGhlIGtleSBmb3IgZWFjaCBvZiB0aGUgbm9kZXMuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgV3JpdGVzIGEgbWVzc2FnZSB0byB0aGUgb3V0cHV0LCB1c3VhbGx5IHN0ZG91dCBvciBzdGRlcnJvLiAgVHlwaWNhbGx5Ci0gICAgICAgICB1c2VkIHRvIHJlcG9ydCBlcnJvcnMgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXJtaW5hdGUiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9Im5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIEluZGljYXRlcyB3aGV0aGVyIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGVuZGVkIGFmdGVyCi0gICAgICAgICAgICAgICAgICBwcm9kdWNpbmcgdGhlIG1lc3NhZ2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBuby4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlLWFsaWFzIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICBBbGxvd3MgcmVwbGFjaW5nIG9mIGEgcGFydGljdWxhciBuYW1lc3BhY2UgZnJvbSB0aGUgc3R5bGUgc2hlZXQgdG8gYSBkaWZmZXJlbnQKLSAgICAgICAgIG5hbWVzcGFjZSB3aGVuIHdyaXRpbmcgdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZXNoZWV0LXByZWZpeCIgdHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0IiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJlZml4IHlvdSB3YW50IHRvIGNoYW5nZS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1wcmVmaXgiIHR5cGU9InhzbDpwcmVmaXgtb3ItZGVmYXVsdCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByZWZpeCB0aGUgcmVzdWx0IGlzIHRvIHVzZS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibnVtYmVyIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbnRlZ2VyIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG5vZGUuICBBbHNvIHVzZWQKLSAgICAgICAgaW4gZm9ybWF0dGluZyBhIG51bWJlci4gICAgIAotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBIG51bWJlciBwcm92aWRlZCBieSB0aGUgaW1wbGVtZW50b3IgaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICAgYSBzeXN0ZW0gZ2VuZXJhdGVkIG51bWJlci4gIFRoZSBwb3NpdGlvbigpIHhwYXRoIGZ1bmN0aW9uIGNhbgotICAgICAgICAgICAgICAgICAgYmUgdXNlZCBhcyB3ZWxsLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV2ZWwiIHR5cGU9InhzbDpsZXZlbCIgZGVmYXVsdD0ic2luZ2xlIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTcGVjaWZpZXMgaG93IHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYXNzaWduZWQuICBWYWxpZCB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgYXJlIHNpbmdsZSAoZGVmYXVsdCksIG11bHRpcGxlLCBhbmQgYW55LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY291bnQiIHR5cGU9InhzbDpwYXR0ZXJuIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQW4gWFBhdGggZXhwcmVzc2lvbiB0aGF0IGluZGljYXRlcyB3aGF0IG5vZGVzIGFyZSB0byBiZQotICAgICAgICAgICAgICAgICBjb3VudGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZnJvbSIgdHlwZT0ieHNsOnBhdHRlcm4iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBbiBYUGF0aCBleHByZXNzaW9uIHRoYXQgaW5kaWNhdGVzIHdoZXJlIGNvdW50aW5nIHdpbGwgc3RhcnQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtYXQiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9IjEiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgZm9ybWF0IHN0cmluZyBpbiB3aGljaCB0aGUgbnVtYmVyIGlzIHRvIGJlIGZvcm1hdHRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzbDphdnQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBUaGUgbGFuZ3VhZ2UgY29kZSB1c2VkIHRvIGluZGljYXRlIHdoYXQgc3Bva2VuIGxhbmd1YWdlIGlzCi0gICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBmb3JtYXQgc3RyaW5nLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV0dGVyLXZhbHVlIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG51bWJlciBpcyBhbHBoYWJldGljYWwgb3IgdHJhZGl0aW9uYWwuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zZXBhcmF0b3IiIHR5cGU9InhzbDphdnQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBUaGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gc2VwZXJhdGUgYSBncm91cCBvZiBudW1iZXJzLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXBpbmctc2l6ZSIgdHlwZT0ieHNsOmF2dCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIEEgbnVtYmVyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gYSBncm91cC4gIFRoZQotICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAzLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJvdGhlcndpc2UiIHR5cGU9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIE90aGVyd2lzZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBkZWZhdWx0IGFjdGlvbiB3aGVuIG5vbmUgb2YgdGhlIAotICAgICAgICAgV2hlbiB0ZXN0cyBhcmUgdHJ1ZSwgaW4gYSBDaG9vc2Ugc3RhdGVtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9Im91dHB1dCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6Z2VuZXJpYy1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNsOm1ldGhvZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFZhbGlkIHZhbHVlcyBhcmUgeG1sLCBodG1sLCBhbmQgdGV4dC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhLXNlY3Rpb24tZWxlbWVudHMiIHR5cGU9InhzbDpRTmFtZXMiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZWxlbWVudHMgd2hvc2UgY29udGVudCBzaG91bGQKLSAgICAgICAgICAgICAgICAgYmUgd3JhcHBlZCB3aXRoIENEQVRBLiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvY3R5cGUtcHVibGljIiB0eXBlPSJ4czpzdHJpbmciPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBQdWJsaWMgZG9jdHlwZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb2N0eXBlLXN5c3RlbSIgdHlwZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgU3lzdGVtIGRvY3R5cGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9InhzOnN0cmluZyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGVuY29kaW5nIHRvIHVzZS4gIGkuZS4gVVRGLTgsIFVURi0xNiwgZXRjLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZW50IiB0eXBlPSJ4c2w6eWVzLW9yLW5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBTaG91bGQgdGhlIHJlc3VsdCBkb2N1bWVudCBiZSBwcmV0dHktcHJpbnRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lZGlhLXR5cGUiIHR5cGU9InhzOnN0cmluZyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuIFRoZSBtaW1lIHR5cGUgb2YgdGhlIHJlc3VsdCBkb2N1bWVudC4gIGkuZS4gdGV4dC94bWwKLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9taXQteG1sLWRlY2xhcmF0aW9uIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFdoZXRoZXIgdGhlIHhtbCBkZWNsYXRpb24gc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIAotICAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RhbmRhbG9uZSIgdHlwZT0ieHNsOnllcy1vci1uby1vci1vbWl0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBJbmRpY2F0ZXMgaWYgYSBzdGFuZGFsb25lIGRlY2xhcnRpb24gc2hvdWxkIG9jY2N1ciBpbiB0aGUKLSAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6Tk1UT0tFTiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gU2V0cyB0aGUgVzNDIHZlcnNpb24gbnVtYmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgcmVzdWx0IGRvY3VtZW50LiAgT25seSB1c2VkIGZvciBIVE1MIG9yIFhNTCBvdXRwdXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InBhcmFtIj4KLSAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICBVc2VkIHRvIGRlY2xhcmUgYSBsb2NhbCBvciBnbG9iYWwgcGFyYW1ldGVyLgotICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gYmUgY3JlYXRlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQW4gWFBhdGggZXhwcmVzc2lvbiB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgIGlmIG5vdGhpbmcgaXMgcGFzc2VkIHRvIGl0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi0KLTx4czplbGVtZW50IG5hbWU9InByZXNlcnZlLXNwYWNlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgSW5kaWNhdGVzIHRoZSBlbGVtZW50cyB0aGF0IGFyZSB0byBoYXZlIHdoaXRlIHNwYWNlIHByZXNlcnZlZCB3aGVuCi0gICAgICAgICBjcmVhdGluZyB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudHMiIHR5cGU9InhzbDpuYW1ldGVzdHMiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQSBzcGFjZSBzZXBlcmF0ZWQgbGlzdCBvZiBlbGVtZW50cyBpbiB3aGljaAotICAgICAgICAgICAgICAgICAgd2hpdGUgc3BhY2UgaXMgc2lnbmlmaWNhbnQgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbgotICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0icHJvY2Vzc2luZy1pbnN0cnVjdGlvbiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgIENyZWF0ZXMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGluIHRoZSByZXN1bHQgZG9jdW1lbnQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRvIGJlIGNyZWF0ZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InNvcnQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgU29ydHMgdGhlIG91dHB1dCBvZiB0aGUgbm9kZSBzZXQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBTcGVjaWZpZXMgdGhlIFhQYXRoIGV4cHJlc3Npb24gdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIG5vZGVzZXQKLSAgICAgICAgICAgICAgICAgdG8gYmUgc29ydGVkLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gVGhlIGxhbmd1YWdlIGNvZGUgdG8gYmUgdXNlZCBmb3Igc29ydGluZy4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2w6YXZ0IiBkZWZhdWx0PSJ0ZXh0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSB0eXBlIG9mIGRhdGEgdGhhdCBpcyBiZWluZyBzb3J0ZWQuIFRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICBpcyB0ZXh0LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0iYXNjZW5kaW5nIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSBzb3J0ZWQuICBUaGUKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgYXNjZW5kaW5nLgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+ICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjYXNlLW9yZGVyIiB0eXBlPSJ4c2w6YXZ0Ij4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFNwZWNpZmllcyBpZiB1cHBlciBvciBsb3dlcmNhc2UgbGV0dGVycyBhcmUgdG8gCi0gICAgICAgICAgICAgICAgICBiZSBzb3J0ZWQgZmlyc3QuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InN0cmlwLXNwYWNlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIERlZmluZXMgd2hpY2ggZWxlbWVudHMgYXJlIHRvIGhhdmUgd2hpdGUgc3BhY2Ugc3RyaXBwZWQgd2hlbgotICAgICAgICB3cml0aW5nIHRoZSByZXN1bHQgZG9jdW1lbnQuICAgICAKLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudHMiIHR5cGU9InhzbDpuYW1ldGVzdHMiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBBIHNwYWNlIHNlcGFyZWF0ZWQgbGlzdCBvZiBlbGVtZW50cyBhcmUgdG8gaGF2ZQotICAgICAgICAgICAgICAgICB3aGl0ZSBzcGFjZSByZW1vdmVkIHdoZW4gd3JpdGluZyB0aGUgcmVzdWx0IGRvY3VtZW50LgotICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJzdHlsZXNoZWV0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOnRyYW5zZm9ybSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgVGhlIHJvb3QgZWxlbWVudCBvZiBhIHN0eWxlIHNoZWV0LiAgQWxzbyBzZWUgdGhlIHRyYW5zZm9ybSBlbGVtZW50LgotICAgICAgICAgRWl0aGVyIHN0eWxlc2hlZXQgb3IgdHJhbnNmb3JtIGNhbiBiZSB1c2VkLiAgVHlwaWNhbGx5IHN0eWxzaGVldCBpcwotICAgICAgICAgdXNlZC4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InRlbXBsYXRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICBBIHRlbXBsYXRlIGNvbnRhaW5zIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFuZCBjb21tYW5kcyBmb3Igbm9kZXMgaW4gdGhlCi0gICAgICAgIGlucHV0IGRvY3VtZW50IHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBYUGF0aCBleHByZXNzaW9uLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpwYXJhbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hdGNoIiB0eXBlPSJ4c2w6cGF0dGVybiI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gQW4gWFBhdGggZXhwcmVzc2lvbiBvciBleHByZXNzaW9ucyB0aGF0IHRoaXMgdGVtcGxhdGUgd2lsbAotICAgICAgICAgICAgICAgICBiZSBhcHBsaWVkIHRvLiAgTm90ZSBpZiB0aGlzIGlzIG9taXR0ZWQsIHRoZW4gYSBuYW1lIGF0dHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgICAgICAgIGJlIHVzZWQuICBFaXRoZXIgYSBuYW1vZSBvciBhIG1hdGNoIGFyZSB0byBiZSB1c2VkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ieHM6ZGVjaW1hbCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBJbmRpY2F0ZXMgdGhlIG51bWVyaWMgcHJpb3J0aXR5IGZvciBwcm9jZXNzaW5nIHRoZQotICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb2RlIiB0eXBlPSJ4c2w6bW9kZXMiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIG5hbWUgb2YgdGhlIG1vZGUgZm9yIHRoaXMgdGVtcGxhdGUuICBVc2VkIHRvIG1hdGNoCi0gICAgICAgICAgICAgICAgICB1cCB3aXRoIHRoZSBhcHBseS10ZW1wbGF0ZXMgbW9kZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIG5hbWUgb2YgYSBjYWxsZWQgdGVtcGxhdGUuICBOb3RlIHRoYXQgaWYgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgbm90IHVzZWQsIHRoZW4gbWF0Y2ggbXVzdCBiZSB1c2VkLiAgWW91IGNhbiBoYXZlIG9uZSBvciB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAgIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRleHQtZWxlbWVudC1iYXNlLXR5cGUiPgotICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotCi0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlQ29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czplbGVtZW50IG5hbWU9InRleHQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIFdyaXRlcyB0ZXh0IGRhdGEgdG8gdGhlIG91dHB1dC4gIGkuZS4gI1BDRGF0YQotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnRleHQtZWxlbWVudC1iYXNlLXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtb3V0cHV0LWVzY2FwaW5nIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJubyI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIEluZGljYXRlcyBpZiBub24gZnJpZW5kbHkgaHRtbCBhbmQgeG1sIGNvbnRlbnQgc2hvdWxkIGJlIGNvbnZlcnRlZAotICAgICAgICAgICAgICAgICB0byB0aGVpciBlbnRpdHkgdHlwZXMuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybS1lbGVtZW50LWJhc2UtdHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6ZGVjaW1hbCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgICAgICAgICBSZXF1aXJlZC4gIFRoZSB2ZXJzaW9uIG51bWJlciBjb3JyZXNwb25kaW5nIHRoZSB0aGUKLSAgICAgICAgICAgICAgICAgWFNMVCBzcGVjaWZpY2F0aW9uIGJlaW5nIHVzZWQuICBGb3IgWFNMVCAxLjAsIHRoaXMgd2lsbAotICAgICAgICAgICAgICAgICBiZSAxLjAuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czplbGVtZW50IG5hbWU9InRyYW5zZm9ybSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgVGhlIHJvb3QgZWxlbWVudCBvZiBhIHN0eWxlIHNoZWV0LiAgQWxzbyBzZWUgdGhlIHN0eWxlc2hlZXQgZWxlbWVudC4KLSAgICAgICAgIEVpdGhlciBzdHlsZXNoZWV0IG9yIHRyYW5zZm9ybSBjYW4gYmUgdXNlZC4gIFR5cGljYWxseSBzdHlsc2hlZXQgaXMKLSAgICAgICAgIHVzZWQuCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dHJhbnNmb3JtLWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmltcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpkZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6dmFyaWFibGUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnBhcmFtIi8+ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4gPCEtLSB3ZWFrZXIgdGhhbiBYU0xUIDEuMCAtLT4KLSAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgT3B0aW9uYWwuICBBIHVuaXF1ZSBJRCBmb3IgdGhlIHN0eWxlc2hlZXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InZhbHVlLW9mIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIFVzZWQgdG8gcHVsbCB0aGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBzZWxlY3RlZCBub2RlIG9yIFhQYXRoIGV4cHJlc3Npb24uCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotCi0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgWFBhdGggZXhwcmVzc2lvbiBvciBjdXJyZW50IG5vZGUgdG8gYmUgdXNlZAotICAgICAgICAgICAgICAgICB0byBwdWxsIHRoZSBkYXRhIGZyb20uCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLW91dHB1dC1lc2NhcGluZyIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ibm8iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiBXaGV0aGVyIG5vbi14bWwgZnJpZW5kbHkgZGF0YSBzaG91bGQgYmUgZW50aXR5IGVzY2FwZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InZhcmlhYmxlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgIERlY2xhcmVzIGEgbG9jYWwgb3IgZ2xvYmFsIHZhcmlhYmxlIHRvIGJlIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAgICAgIFRoZSBjb250ZW50cyBvZiB2YXJpYWJsZSBjYW4gYmUgcG9wdWxhdGVkIGJ5IGVpdGhlciBhIHNlcmllcyBvZgotICAgICAgICBYU0xUIGNvbW1hbmRzIG9yIFhQYXRoIGV4cHJlc3Npb25zLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgUmVxdWlyZWQuICBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuICBUaGlzIGlzIGhvdyB0aGUKLSAgICAgICAgICAgICAgICAgdmFyaWFibGUgaXMgYWNjZXNzZWQgbGF0ZXIgaW4gdGhlIHN0eWxlc2hlZXQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9Im9wdGlvbmFsIj4KLSAgICAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCI+Ci0gICAgICAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBYUGF0aCBleHByZXNzaW9uIGluIHdoaWNoIHRoZSB2YXJpYWJsZSBpcwotICAgICAgICAgICAgICAgICAgcG9wdWxhdGVkIGZyb20uICBUaGlzIHNwZWNpZmllcyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgdG8gZ2V0Ci0gICAgICAgICAgICAgICAgICBpdCdzIGRhdGEgdmFsdWUgZnJvbS4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0id2hlbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQiPgotICAgICAgICAgQSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgc2ltaWxpYXIgdG8gYW4gaWYgc3RhdGVtZW50LCB1c2VkIHRvIHRlc3QKLSAgICAgICAgIGlmIGEgcGFydGljdWxhciBleHByZXNzaW9uIGlzIHRydWUgb3IgZmFsc2UuICBVc2Ugd2l0aCB0aGUgQ2hvb3NlIGFuZAotICAgICAgICAgT3RoZXIgd2lzZSBlbGVtZW50cy4KLSAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGVzdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgQW4gWFBhdGggZXhwcmVzc2lvbiB0aGF0IHRlc3RzIHRvIHRydWUgb3IgZmFsc2UuICBJZiB0cnVlCi0gICAgICAgICAgICAgICAgIHRoZSBzdGF0ZW1lbnRzIHdpdGhpbiBhcmUgZXhlY3V0ZWQuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9IndpdGgtcGFyYW0iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgRGVmaW5lcyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIHRvIGEgY2FsbGVkIHRlbXBsYXRlLgotICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLQotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIFJlcXVpcmVkLiAgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuICBUaGlzCi0gICAgICAgICAgICAgICAgICBtdXN0IGV4aXN0IGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGlzIGJlaW5nIGNhbGxlZC4KLSAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iPgotICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0Ij4KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgQW4gWFBhdGggZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgdG8gc2V0Ci0gICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgcGFzc2VkIHRvIGEgdGVtcGxhdGUuCi0gICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUEFSVCBDOiBkZWZpbml0aW9uIG9mIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzCi0gICAgCi0gICAgVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZGVmaW5lIHRoZSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50cwotICAgIHBlcm1pc3NpYmxlIGluIGEgc3R5bGVzaGVldC4KLSAgICAKLSAgICAoYSkgZG8gbm90aGluZy4gVGhpcyBhbGxvd3MgYW55IGVsZW1lbnQgdG8gYmUgdXNlZCBhcyBhIGxpdGVyYWwKLSAgICAgICAgcmVzdWx0IGVsZW1lbnQsIHByb3ZpZGVkIGl0IGlzIG5vdCBpbiB0aGUgWFNMVCBuYW1lc3BhY2UKLSAgICAKLSAgICAoYikgZGVjbGFyZSBhbGwgcGVybWl0dGVkIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzIGFzIG1lbWJlcnMKLSAgICAgICAgb2YgdGhlIHhzbDpsaXRlcmFsLXJlc3VsdC1lbGVtZW50IHN1YnN0aXR1dGlvbiBncm91cAotICAgICAgICAKLSAgICAoYykgcmVkZWZpbmUgdGhlIG1vZGVsIGdyb3VwIHhzbDpyZXN1bHQtZWxlbWVudHMgdG8gYWNjb21tb2RhdGUKLSAgICAgICAgYWxsIHBlcm1pdHRlZCBsaXRlcmFsIHJlc3VsdCBlbGVtZW50cy4KLSAgICAgICAgCi0gICAgTGl0ZXJhbCByZXN1bHQgZWxlbWVudHMgYXJlIGFsbG93ZWQgdG8gdGFrZSBjZXJ0YWluIGF0dHJpYnV0ZXMKLSAgICBpbiB0aGUgWFNMVCBuYW1lc3BhY2UuIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBhdHRyaWJ1dGUgZ3JvdXAKLSAgICBsaXRlcmFsLXJlc3VsdC1lbGVtZW50LWF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICBkZWZpbml0aW9uIG9mIGFueSBsaXRlcmFsIHJlc3VsdCBlbGVtZW50LgotICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci0KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czplbGVtZW50IG5hbWU9ImxpdGVyYWwtcmVzdWx0LWVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0KLTx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJsaXRlcmFsLXJlc3VsdC1lbGVtZW50LWF0dHJpYnV0ZXMiPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29sbGF0aW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDp1cmktbGlzdCIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpwcmVmaXhlcyIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpwcmVmaXhlcyIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoLWRlZmF1bHQtbmFtZXNwYWNlIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzOmFueVVSSSIvPiAgICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmhlcml0LW5hbWVzcGFjZXMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLXdoZW4iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpRTmFtZSIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnZhbGlkYXRpb24tdHlwZSIvPgotPC94czphdHRyaWJ1dGVHcm91cD4KLQotPHhzOmdyb3VwIG5hbWU9InJlc3VsdC1lbGVtZW50cyI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6bGl0ZXJhbC1yZXN1bHQtZWxlbWVudCIvPgotICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4KLQotICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2xvY2FsIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4KLSAgPC94czpjaG9pY2U+Ci08L3hzOmdyb3VwPgotCi0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUEFSVCBEOiBkZWZpbml0aW9ucyBvZiBzaW1wbGUgdHlwZXMgdXNlZCBpbiBzdHlsZXNoZWV0IGF0dHJpYnV0ZXMgCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImF2dCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhpcyB0eXBlIGlzIHVzZWQgZm9yIGFsbCBhdHRyaWJ1dGVzIHRoYXQgYWxsb3cgYW4gYXR0cmlidXRlIHZhbHVlIHRlbXBsYXRlLgotICAgICAgVGhlIGdlbmVyYWwgcnVsZXMgZm9yIHRoZSBzeW50YXggb2YgYXR0cmlidXRlIHZhbHVlIHRlbXBsYXRlcywgYW5kIHRoZSBzcGVjaWZpYwotICAgICAgcnVsZXMgZm9yIGVhY2ggc3VjaCBhdHRyaWJ1dGUsIGFyZSBkZXNjcmliZWQgaW4gdGhlIFhTTFQgMi4wIFJlY29tbWVuZGF0aW9uLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImNoYXIiPgotICA8eHM6YW5ub3RhdGlvbj4KLQotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBzdHJpbmcgY29udGFpbmluZyBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgIDx4czpsZW5ndGggdmFsdWU9IjEiLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iZXhwcmVzc2lvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBbiBYUGF0aCAyLjAgZXhwcmVzc2lvbi4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6cGF0dGVybiB2YWx1ZT0iLisiLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iaW5wdXQtdHlwZS1hbm5vdGF0aW9ucy10eXBlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIERlc2NyaWJlcyBob3cgdHlwZSBhbm5vdGF0aW9ucyBpbiBzb3VyY2UgZG9jdW1lbnRzIGFyZSBoYW5kbGVkLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmlwIi8+ICAgCi0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bnNwZWNpZmllZCIvPiAgICAgICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImxldmVsIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgbGV2ZWwgYXR0cmlidXRlIG9mIHhzbDpudW1iZXI6IAotICAgICAgb25lIG9mIHNpbmdsZSwgbXVsdGlwbGUsIG9yIGFueS4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzaW5nbGUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im11bHRpcGxlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbnkiLz4KLQotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJtb2RlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgbW9kZSBhdHRyaWJ1dGUgb2YgeHNsOmFwcGx5LXRlbXBsYXRlczogCi0gICAgICBlaXRoZXIgYSBRTmFtZSwgb3IgI2N1cnJlbnQsIG9yICNkZWZhdWx0LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzbDpRTmFtZSI+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2RlZmF1bHQiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjY3VycmVudCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Im1vZGVzIj4KLSAgPHhzOmFubm90YXRpb24+Ci0KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBtb2RlIGF0dHJpYnV0ZSBvZiB4c2w6dGVtcGxhdGU6IAotICAgICAgZWl0aGVyIGEgbGlzdCwgZWFjaCBtZW1iZXIgYmVpbmcgZWl0aGVyIGEgUU5hbWUgb3IgI2RlZmF1bHQ7Ci0gICAgICBvciB0aGUgdmFsdWUgI2FsbAotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6bGlzdD4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2w6UU5hbWUiPgotCi0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNkZWZhdWx0Ii8+Ci0gICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPC94czp1bmlvbj4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPC94czpsaXN0PgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibmFtZXRlc3RzIj4KLSAgPHhzOmFubm90YXRpb24+Ci0KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgbGlzdCBvZiBOYW1lVGVzdHMsIGFzIGRlZmluZWQgaW4gdGhlIFhQYXRoIDIuMCBSZWNvbW1lbmRhdGlvbi4KLSAgICAgIEVhY2ggTmFtZVRlc3QgaXMgZWl0aGVyIGEgUU5hbWUsIG9yICIqIiwgb3IgInByZWZpeDoqIiwgb3IgIio6bG9jYWxuYW1lIgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6bGlzdD4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHNsOlFOYW1lIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLQotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxpXGMqOlwqIi8+Ci0gICAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXCo6XGlcYyoiLz4gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICAgIDwveHM6dW5pb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOmxpc3Q+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InByZWZpeGVzIj4KLSAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOk5DTmFtZSIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwcmVmaXgtbGlzdC1vci1hbGwiPgotICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzbDpwcmVmaXgtbGlzdCI+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAKLTx4czpzaW1wbGVUeXBlIG5hbWU9InByZWZpeC1saXN0Ij4KLSAgPHhzOmxpc3QgaXRlbVR5cGU9InhzbDpwcmVmaXgtb3ItZGVmYXVsdCIvPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJtZXRob2QiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBtZXRob2QgYXR0cmlidXRlIG9mIHhzbDpvdXRwdXQ6Ci0gICAgICBFaXRoZXIgb25lIG9mIHRoZSByZWNvZ25pemVkIG5hbWVzICJ4bWwiLCAieGh0bWwiLCAiaHRtbCIsICJ0ZXh0IiwKLSAgICAgIG9yIGEgUU5hbWUgdGhhdCBtdXN0IGluY2x1ZGUgYSBwcmVmaXguCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InhtbCIvPgotCi0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieGh0bWwiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJodG1sIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGV4dCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOlFOYW1lIj4KLSAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxjKjpcYyoiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InBhdHRlcm4iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgbWF0Y2ggcGF0dGVybiBhcyBkZWZpbmVkIGluIHRoZSBYU0xUIDIuMCBSZWNvbW1lbmRhdGlvbi4KLSAgICAgIFRoZSBzeW50YXggZm9yIHBhdHRlcm5zIGlzIGEgcmVzdHJpY3RlZCBmb3JtIG9mIHRoZSBzeW50YXggZm9yCi0gICAgICBYUGF0aCAyLjAgZXhwcmVzc2lvbnMuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotCi08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InByZWZpeC1vci1kZWZhdWx0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBFaXRoZXIgYSBuYW1lc3BhY2UgcHJlZml4LCBvciAjZGVmYXVsdC4KLSAgICAgIFVzZWQgaW4gdGhlIHhzbDpuYW1lc3BhY2UtYWxpYXMgZWxlbWVudC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4czpOQ05hbWUiPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLQotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNkZWZhdWx0Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iUU5hbWVzIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIGxpc3Qgb2YgUU5hbWVzLgotICAgICAgVXNlZCBpbiB0aGUgW3hzbDpddXNlLWF0dHJpYnV0ZS1zZXRzIGF0dHJpYnV0ZSBvZiB2YXJpb3VzIGVsZW1lbnRzLAotICAgICAgYW5kIGluIHRoZSBjZGF0YS1zZWN0aW9uLWVsZW1lbnRzIGF0dHJpYnV0ZSBvZiB4c2w6b3V0cHV0Ci0gICAgPC94czpkb2N1bWVudGF0aW9uPgotCi0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOmxpc3QgaXRlbVR5cGU9InhzbDpRTmFtZSIvPiAgICAgICAgICAKLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iUU5hbWUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEEgUU5hbWUuCi0gICAgICBUaGlzIHNjaGVtYSBkb2VzIG5vdCB1c2UgdGhlIGJ1aWx0LWluIHR5cGUgeHM6UU5hbWUsIGJ1dCByYXRoZXIgZGVmaW5lcyBpdHMgb3duCi0gICAgICBRTmFtZSB0eXBlLiBBbHRob3VnaCB4czpRTmFtZSB3b3VsZCBkZWZpbmUgdGhlIGNvcnJlY3QgdmFsaWRhdGlvbiBvbiB0aGVzZSBhdHRyaWJ1dGVzLAotICAgICAgYSBzY2hlbWEgcHJvY2Vzc29yIHdvdWxkIGV4cGFuZCB1bnByZWZpeGVkIFFOYW1lcyBpbmNvcnJlY3RseSB3aGVuIGNvbnN0cnVjdGluZyB0aGUgUFNWSSwKLSAgICAgIGJlY2F1c2UgKGFzIGRlZmluZWQgaW4gWE1MIFNjaGVtYSBlcnJhdGEpIGFuIHVucHJlZml4ZWQgeHM6UU5hbWUgaXMgYXNzdW1lZCB0byBiZSBpbgotICAgICAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCB3aGljaCBpcyBub3QgdGhlIGNvcnJlY3QgYXNzdW1wdGlvbiBmb3IgWFNMVC4KLSAgICAgIFRoZSBkYXRhIHR5cGUgaXMgZGVmaW5lZCBhcyBhIHJlc3RyaWN0aW9uIG9mIHRoZSBidWlsdC1pbiB0eXBlIE5hbWUsIHJlc3RyaWN0ZWQKLSAgICAgIHNvIHRoYXQgaXQgY2FuIG9ubHkgY29udGFpbiBvbmUgY29sb24gd2hpY2ggbXVzdCBub3QgYmUgdGhlIGZpcnN0IG9yIGxhc3QgY2hhcmFjdGVyLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TmFtZSI+Ci0KLSAgICA8eHM6cGF0dGVybiB2YWx1ZT0iKFteOl0rOik/W146XSsiLz4gICAgICAKLSAgPC94czpyZXN0cmljdGlvbj4gICAgICAgIAotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJzZXF1ZW5jZS10eXBlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgZGVzY3JpcHRpb24gb2YgYSBkYXRhIHR5cGUsIGNvbmZvcm1pbmcgdG8gdGhlCi0gICAgICBTZXF1ZW5jZVR5cGUgcHJvZHVjdGlvbiBkZWZpbmVkIGluIHRoZSBYUGF0aCAyLjAgUmVjb21tZW5kYXRpb24KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLQotICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIuKyIvPiAgICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ1cmktbGlzdCI+Ci0gIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czphbnlVUkkiLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0idmFsaWRhdGlvbi1zdHJpcC1vci1wcmVzZXJ2ZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRGVzY3JpYmVzIGRpZmZlcmVudCB3YXlzIG9mIHR5cGUtYW5ub3RhdGluZyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOnZhbGlkYXRpb24tdHlwZSI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaXAiLz4gICAgCi0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InZhbGlkYXRpb24tdHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRGVzY3JpYmVzIGRpZmZlcmVudCB3YXlzIG9mIHR5cGUtYW5ub3RhdGluZyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaWN0Ii8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsYXgiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpcCIvPiAgICAKLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ieWVzLW9yLW5vIj4KLSAgPHhzOmFubm90YXRpb24+Ci0KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE9uZSBvZiB0aGUgdmFsdWVzICJ5ZXMiIG9yICJubyIuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Inllcy1vci1uby1vci1vbWl0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBPbmUgb2YgdGhlIHZhbHVlcyAieWVzIiBvciAibm8iIG9yICJvbWl0Ii4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9taXQiLz4KLQotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3hzbHQtc2NoZW1hcy94c2x0LTIuMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuY29yZS94c2x0LXNjaGVtYXMveHNsdC0yLjAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWZkMjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlL3hzbHQtc2NoZW1hcy94c2x0LTIuMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgLSBXM0MsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwKLSAqIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSAyMDA4MDMzMCAtIFNUQVIgLSBidWcgMjI0ODE5IC0gY2hhbmdlZCBwcm9jZXNDb250ZW50cyBmcm9tIGxheCB0byBza2lwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVzNDwq4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFCi0gKiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMAotICoKLSAqIENvcHlyaWdodCDCqSAxOTk0LTIwMDIgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCi0gKiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLAotICogS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KLSAqCi0gKiBUaGlzIFczQyB3b3JrIChpbmNsdWRpbmcgc29mdHdhcmUsIGRvY3VtZW50cywgb3Igb3RoZXIgcmVsYXRlZCBpdGVtcykgaXMgYmVpbmcKLSAqIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UuIEJ5IG9idGFpbmluZywKLSAqIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwKLSAqIHVuZGVyc3Rvb2QsIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZQotICogb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMKLSAqIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgdGhhdAotICogeW91IG1ha2U6Ci0gKgotICogIDEuIFRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUgcmVkaXN0cmlidXRlZAotICogICAgIG9yIGRlcml2YXRpdmUgd29yay4KLSAqICAyLiBBbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IgdGVybXMgYW5kCi0gKiAgICAgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgYSBzaG9ydCBub3RpY2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtIChoeXBlcnRleHQgaXMgcHJlZmVycmVkLCB0ZXh0IGlzIHBlcm1pdHRlZCkgc2hvdWxkIGJlIHVzZWQgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZTogIkNvcHlyaWdodCDCqSBbJGRhdGUtb2Ytc29mdHdhcmVdIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyIKLSAqICAzLiBOb3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgVzNDIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGRhdGUgY2hhbmdlcwotICogICAgIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzCi0gKiAgICAgZGVyaXZlZC4pCi0gKgotICogVEhJUyBTT0ZUV0FSRSBBTkQgRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMsIiBBTkQgQ09QWVJJR0hUIEhPTERFUlMgTUFLRSBOTyAKLSAqIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8sIAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YKLSAqIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLAotICogVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuCi0gKgotICogQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCi0gKgotICogVGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgY29weXJpZ2h0IGhvbGRlcnMgbWF5IE5PVCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQotICogcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQKLSAqIGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0Ci0gKiBob2xkZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gIAotICAgIFRoaXMgaXMgYSBzY2hlbWEgZm9yIFhTTFQgMi4wIHN0eWxlc2hlZXRzLgotICAgIAotICAgIEl0IGRlZmluZXMgYWxsIHRoZSBlbGVtZW50cyB0aGF0IGFwcGVhciBpbiB0aGUgWFNMVCBuYW1lc3BhY2U7IGl0IGFsc28KLSAgICBwcm92aWRlcyBob29rcyB0aGF0IGFsbG93IHRoZSBpbmNsdXNpb24gb2YgdXNlci1kZWZpbmVkIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzLAotICAgIGV4dGVuc2lvbiBpbnN0cnVjdGlvbnMsIGFuZCB0b3AtbGV2ZWwgZGF0YSBlbGVtZW50cy4KLSAgICAKLSAgICBUaGUgc2NoZW1hIGlzIGRlcml2ZWQgKHdpdGgga2luZCBwZXJtaXNzaW9uKSBmcm9tIGEgc2NoZW1hIGZvciBYU0xUIDEuMCBzdHlsZXNoZWV0cwotICAgIHByb2R1Y2VkIGJ5IEFzaXIgUyBWZWRhbXV0aHUgb2YgV2ViTWV0aG9kcyBJbmMuCi0gICAgCi0gICAgVGhpcyBzY2hlbWEgaXMgYXZhaWxhYmxlIGZvciB1c2UgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlCi0gICAgcHVibGlzaGVkIGF0IGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCi0gICAgCi0gICAgVGhlIHNjaGVtYSBpcyBvcmdhbml6ZWQgYXMgZm9sbG93czoKLSAgICAKLSAgICBQQVJUIEE6IGRlZmluaXRpb25zIG9mIGNvbXBsZXggdHlwZXMgYW5kIG1vZGVsIGdyb3VwcyB1c2VkIGFzIHRoZSBiYXNpcyAKLSAgICAgICAgICAgIGZvciBlbGVtZW50IGRlZmluaXRpb25zCi0gICAgUEFSVCBCOiBkZWZpbml0aW9ucyBvZiBpbmRpdmlkdWFsIFhTTFQgZWxlbWVudHMKLSAgICBQQVJUIEM6IGRlZmluaXRpb25zIGZvciBsaXRlcmFsIHJlc3VsdCBlbGVtZW50cwotICAgIFBBUlQgRDogZGVmaW5pdGlvbnMgb2Ygc2ltcGxlIHR5cGVzIHVzZWQgaW4gYXR0cmlidXRlIGRlZmluaXRpb25zCi0gICAgCi0gICAgVGhpcyBzY2hlbWEgZG9lcyBub3QgYXR0ZW1wdCB0byBkZWZpbmUgYWxsIHRoZSBjb25zdHJhaW50cyB0aGF0IGFwcGx5IHRvIGEgdmFsaWQKLSAgICBYU0xUIDIuMCBzdHlsZXNoZWV0IG1vZHVsZS4gSXQgaXMgdGhlIGludGVudGlvbiB0aGF0IGFsbCB2YWxpZCBzdHlsZXNoZWV0IG1vZHVsZXMgCi0gICAgc2hvdWxkIGNvbmZvcm0gdG8gdGhpcyBzY2hlbWE7IGhvd2V2ZXIsIHRoZSBzY2hlbWEgaXMgbm9uLW5vcm1hdGl2ZSBhbmQgaW4gdGhlIGV2ZW50IAotICAgIG9mIGFueSBjb25mbGljdCwgdGhlIHRleHQgb2YgdGhlIFJlY29tbWVuZGF0aW9uIHRha2VzIHByZWNlZGVuY2UuCi0KLSAgICBUaGlzIHNjaGVtYSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIHNwZWNpYWwgcnVsZXMgdGhhdCBhcHBseSB3aGVuIGEgc3R5bGVzaGVldAotICAgIGhhcyBzZWN0aW9ucyB0aGF0IHVzZSBmb3J3YXJkcy1jb21wYXRpYmxlLW1vZGUuIEluIHRoaXMgbW9kZSwgc2V0dGluZyB2ZXJzaW9uPSIzLjAiCi0gICAgYWxsb3dzIGVsZW1lbnRzIGZyb20gdGhlIFhTTFQgbmFtZXNwYWNlIHRvIGJlIHVzZWQgdGhhdCBhcmUgbm90IGRlZmluZWQgaW4gWFNMVCAyLjAuCi0KLSAgICBTaW1wbGlmaWVkIHN0eWxlc2hlZXRzICh0aG9zZSB3aXRoIGEgbGl0ZXJhbCByZXN1bHQgZWxlbWVudCBhcyB0aGUgb3V0ZXJtb3N0IGVsZW1lbnQpCi0gICAgd2lsbCB2YWxpZGF0ZSBhZ2FpbnN0IHRoaXMgc2NoZW1hIG9ubHkgaWYgdmFsaWRhdGlvbiBzdGFydHMgaW4gbGF4IG1vZGUuCi0gICAgCi0gICAgVGhpcyB2ZXJzaW9uIGlzIGRhdGVkIDIwMDUtMDItMTEKLSAgICBBdXRob3JzOiBNaWNoYWVsIEggS2F5LCBTYXhvbmljYSBMaW1pdGVkCi0gICAgICAgICAgICAgSmVuaSBUZW5uaXNvbiwgSmVuaSBUZW5uaXNvbiBDb25zdWx0aW5nIEx0ZC4KLSAgICAKLSAgPC94czpkb2N1bWVudGF0aW9uPgotPC94czphbm5vdGF0aW9uPiAgIAotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLSAKLTwhLS0KLVRoZSBkZWNsYXJhdGlvbiBvZiB4bWw6c3BhY2UgYW5kIHhtbDpsYW5nIG1heSBuZWVkIHRvIGJlIGNvbW1lbnRlZCBvdXQgYmVjYXVzZQotb2YgcHJvYmxlbXMgcHJvY2Vzc2luZyB0aGUgc2NoZW1hIHVzaW5nIHZhcmlvdXMgdG9vbHMKLS0tPgotICAgICAgCi08eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAKLSAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi08IS0tIAotICAgIEFuIFhTTFQgc3R5bGVzaGVldCBtYXkgY29udGFpbiBhbiBpbi1saW5lIHNjaGVtYSB3aXRoaW4gYW4geHNsOmltcG9ydC1zY2hlbWEgZWxlbWVudCwKLSAgICBzbyB0aGUgU2NoZW1hIGZvciBzY2hlbWFzIG5lZWRzIHRvIGJlIGltcG9ydGVkCi0tLT4KLSAgCi08eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEueHNkIi8+Ci0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUEFSVCBBOiBkZWZpbml0aW9ucyBvZiBjb21wbGV4IHR5cGVzIGFuZCBtb2RlbCBncm91cHMgdXNlZCBhcyB0aGUgYmFzaXMgCi0gICAgICAgICAgICBmb3IgZWxlbWVudCBkZWZpbml0aW9ucwotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJpYy1lbGVtZW50LXR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LWNvbGxhdGlvbiIgdHlwZT0ieHNsOnVyaS1saXN0Ii8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXMiIHR5cGU9InhzbDpwcmVmaXgtbGlzdC1vci1hbGwiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcyIgdHlwZT0ieHNsOnByZWZpeC1saXN0Ii8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLXdoZW4iIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ieHBhdGgtZGVmYXVsdC1uYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbmVkLWVsZW1lbnQtdHlwZSIgbWl4ZWQ9InRydWUiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6Z2VuZXJpYy1lbGVtZW50LXR5cGUiPiAgICAKLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6ZGVjaW1hbCIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHM6ZXh0ZW5zaW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIiBtaXhlZD0iZmFsc2UiPgotICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOmNvbXBsZXhDb250ZW50PgotPC94czpjb21wbGV4VHlwZT4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4gICAgCi0gICAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzOmV4dGVuc2lvbj4KLSAgPC94czpjb21wbGV4Q29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czpncm91cCBuYW1lPSJzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCI+Ci0gIDx4czpjaG9pY2U+Ci0gICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6dmFyaWFibGUiLz4KLSAgICA8eHM6ZWxlbWVudCByZWY9InhzbDppbnN0cnVjdGlvbiIvPgotICAgIDx4czpncm91cCByZWY9InhzbDpyZXN1bHQtZWxlbWVudHMiLz4KLSAgPC94czpjaG9pY2U+Ci08L3hzOmdyb3VwPgotCi08eHM6ZWxlbWVudCBuYW1lPSJkZWNsYXJhdGlvbiIgdHlwZT0ieHNsOmdlbmVyaWMtZWxlbWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbnN0cnVjdGlvbiIgdHlwZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiIGFic3RyYWN0PSJ0cnVlIi8+Ci0KLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci08eHM6YW5ub3RhdGlvbj4KLSAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgUEFSVCBCOiBkZWZpbml0aW9ucyBvZiBpbmRpdmlkdWFsIFhTTFQgZWxlbWVudHMgICAgCi0gICAgRWxlbWVudHMgYXJlIGxpc3RlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuICAgIAotICA8L3hzOmRvY3VtZW50YXRpb24+Ci08L3hzOmFubm90YXRpb24+ICAgCi08IS0tICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIC0tPgotCi08eHM6ZWxlbWVudCBuYW1lPSJhbmFseXplLXN0cmluZyIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDptYXRjaGluZy1zdWJzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm5vbi1tYXRjaGluZy1zdWJzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmZhbGxiYWNrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZ2V4IiB0eXBlPSJ4c2w6YXZ0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmxhZ3MiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9IiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHktaW1wb3J0cyIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJhcHBseS10ZW1wbGF0ZXMiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnNvcnQiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIi8+Ci0gICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIGRlZmF1bHQ9ImNoaWxkOjpub2RlKCkiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb2RlIiB0eXBlPSJ4c2w6bW9kZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXBhcmF0b3IiIHR5cGU9InhzbDphdnQiLz4gICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJ4c2w6dmFsaWRhdGlvbi10eXBlIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PiAgICAgICAgCi0KLTx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1zZXQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6YXR0cmlidXRlIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiB0eXBlPSJ4c2w6UU5hbWVzIiBkZWZhdWx0PSIiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNhbGwtdGVtcGxhdGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6d2l0aC1wYXJhbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY2hhcmFjdGVyLW1hcCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpvdXRwdXQtY2hhcmFjdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWNoYXJhY3Rlci1tYXBzIiB0eXBlPSJ4c2w6UU5hbWVzIiBkZWZhdWx0PSIiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNob29zZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aGVuIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOm90aGVyd2lzZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJjb21tZW50IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iY29weSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvcHktbmFtZXNwYWNlcyIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5oZXJpdC1uYW1lc3BhY2VzIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJ5ZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtYXR0cmlidXRlLXNldHMiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImNvcHktb2YiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb3B5LW5hbWVzcGFjZXMiIHR5cGU9InhzbDp5ZXMtb3Itbm8iIGRlZmF1bHQ9InllcyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImRlY2ltYWwtZm9ybWF0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWNpbWFsLXNlcGFyYXRvciIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9Ii4iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cGluZy1zZXBhcmF0b3IiIHR5cGU9InhzbDpjaGFyIiBkZWZhdWx0PSIsIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5maW5pdHkiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iSW5maW5pdHkiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW51cy1zaWduIiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iLSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Ik5hTiIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJOYU4iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwZXJjZW50IiB0eXBlPSJ4c2w6Y2hhciIgZGVmYXVsdD0iJSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBlci1taWxsZSIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IiYjeDIwMzA7Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iemVyby1kaWdpdCIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IjAiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaWdpdCIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IiMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXR0ZXJuLXNlcGFyYXRvciIgdHlwZT0ieHNsOmNoYXIiIGRlZmF1bHQ9IjsiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6YXZ0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5oZXJpdC1uYW1lc3BhY2VzIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIiBkZWZhdWx0PSJ5ZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtYXR0cmlidXRlLXNldHMiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImZhbGxiYWNrIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZm9yLWVhY2giIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6c29ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImZvci1lYWNoLWdyb3VwIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnNvcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXAtYnkiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXAtYWRqYWNlbnQiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+ICAgICAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXAtc3RhcnRpbmctd2l0aCIgdHlwZT0ieHNsOnBhdHRlcm4iLz4gICAgICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJncm91cC1lbmRpbmctd2l0aCIgdHlwZT0ieHNsOnBhdHRlcm4iLz4gICAgICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb2xsYXRpb24iIHR5cGU9InhzOmFueVVSSSIvPiAgICAgICAgICAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24iIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6cGFyYW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3ItZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZSIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXMiIHR5cGU9InhzbDpzZXF1ZW5jZS10eXBlIiBkZWZhdWx0PSJpdGVtKCkqIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRlc3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0iaW1wb3J0LXNjaGVtYSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDplbGVtZW50LW9ubHktdmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnNjaGVtYSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYS1sb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIi8+ICAgICAgICAgICAgICAgICAgCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9ImtleSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzbDpRTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hdGNoIiB0eXBlPSJ4c2w6cGF0dGVybiIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb2xsYXRpb24iIHR5cGU9InhzOmFueVVSSSIvPiAgICAgICAgICAgICAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibWF0Y2hpbmctc3Vic3RyaW5nIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0ZXJtaW5hdGUiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9Im5vIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJ0cnVlIj4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2w6YXZ0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlLWFsaWFzIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZXNoZWV0LXByZWZpeCIgdHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXByZWZpeCIgdHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJuZXh0LW1hdGNoIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDp3aXRoLXBhcmFtIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6ZmFsbGJhY2siLz4KLSAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJub24tbWF0Y2hpbmctc3Vic3RyaW5nIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0ibnVtYmVyIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp2ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWxlY3QiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV2ZWwiIHR5cGU9InhzbDpsZXZlbCIgZGVmYXVsdD0ic2luZ2xlIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY291bnQiIHR5cGU9InhzbDpwYXR0ZXJuIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZnJvbSIgdHlwZT0ieHNsOnBhdHRlcm4iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtYXQiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9IjEiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGV0dGVyLXZhbHVlIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3JkaW5hbCIgdHlwZT0ieHNsOmF2dCIvPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXBpbmctc2VwYXJhdG9yIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ3JvdXBpbmctc2l6ZSIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ib3RoZXJ3aXNlIiB0eXBlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiLz4KLQotPHhzOmVsZW1lbnQgbmFtZT0ib3V0cHV0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmRlY2xhcmF0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpnZW5lcmljLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2w6bWV0aG9kIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYnl0ZS1vcmRlci1tYXJrIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2RhdGEtc2VjdGlvbi1lbGVtZW50cyIgdHlwZT0ieHNsOlFOYW1lcyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvY3R5cGUtcHVibGljIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb2N0eXBlLXN5c3RlbSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVzY2FwZS11cmktYXR0cmlidXRlcyIgdHlwZT0ieHNsOnllcy1vci1ubyIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImluY2x1ZGUtY29udGVudC10eXBlIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZW50IiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVkaWEtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm9ybWFsaXphdGlvbi1mb3JtIiB0eXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib21pdC14bWwtZGVjbGFyYXRpb24iIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGFuZGFsb25lIiB0eXBlPSJ4c2w6eWVzLW9yLW5vLW9yLW9taXQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1bmRlY2xhcmUtcHJlZml4ZXMiIHR5cGU9InhzbDp5ZXMtb3Itbm8iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtY2hhcmFjdGVyLW1hcHMiIHR5cGU9InhzbDpRTmFtZXMiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQtY2hhcmFjdGVyIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjaGFyYWN0ZXIiIHR5cGU9InhzbDpjaGFyIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InBhcmFtIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFzIiB0eXBlPSJ4c2w6c2VxdWVuY2UtdHlwZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHVubmVsIiB0eXBlPSJ4c2w6eWVzLW9yLW5vIi8+ICAgICAgICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InBlcmZvcm0tc29ydCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpzb3J0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHNsOnNlcXVlbmNlLWNvbnN0cnVjdG9yLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0icHJlc2VydmUtc3BhY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnRzIiB0eXBlPSJ4c2w6bmFtZXRlc3RzIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJwcm9jZXNzaW5nLWluc3RydWN0aW9uIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOmF2dCIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InJlc3VsdC1kb2N1bWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm1hdCIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzbDpRTmFtZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJieXRlLW9yZGVyLW1hcmsiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZGF0YS1zZWN0aW9uLWVsZW1lbnRzIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZG9jdHlwZS1wdWJsaWMiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb2N0eXBlLXN5c3RlbSIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZXNjYXBlLXVyaS1hdHRyaWJ1dGVzIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZS1jb250ZW50LXR5cGUiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRlbnQiIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZWRpYS10eXBlIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm9ybWFsaXphdGlvbi1mb3JtIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib21pdC14bWwtZGVjbGFyYXRpb24iIHR5cGU9InhzbDphdnQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGFuZGFsb25lIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idW5kZWNsYXJlLXByZWZpeGVzIiB0eXBlPSJ4c2w6YXZ0Ii8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWNoYXJhY3Rlci1tYXBzIiB0eXBlPSJ4c2w6UU5hbWVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3V0cHV0LXZlcnNpb24iIHR5cGU9InhzbDphdnQiLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlIiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOmluc3RydWN0aW9uIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFzIiB0eXBlPSJ4c2w6c2VxdWVuY2UtdHlwZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ic29ydCI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4gIAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzbDphdnQiLz4gICAgICAgIAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNsOmF2dCIgZGVmYXVsdD0idGV4dCIvPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InhzbDphdnQiIGRlZmF1bHQ9ImFzY2VuZGluZyIvPiAgICAgICAgCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2FzZS1vcmRlciIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbGxhdGlvbiIgdHlwZT0ieHNsOmF2dCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0YWJsZSIgdHlwZT0ieHNsOnllcy1vci1ubyIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0ic3RyaXAtc3BhY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6ZGVjbGFyYXRpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6ZWxlbWVudC1vbmx5LXZlcnNpb25lZC1lbGVtZW50LXR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnRzIiB0eXBlPSJ4c2w6bmFtZXRlc3RzIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJzdHlsZXNoZWV0IiBzdWJzdGl0dXRpb25Hcm91cD0ieHNsOnRyYW5zZm9ybSIvPgotCi08eHM6ZWxlbWVudCBuYW1lPSJ0ZW1wbGF0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDpkZWNsYXJhdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpwYXJhbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpncm91cCByZWY9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3Rvci1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hdGNoIiB0eXBlPSJ4c2w6cGF0dGVybiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibW9kZSIgdHlwZT0ieHNsOm1vZGVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXMiIHR5cGU9InhzbDpzZXF1ZW5jZS10eXBlIiBkZWZhdWx0PSJpdGVtKCkqIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6Y29tcGxleFR5cGUgbmFtZT0idGV4dC1lbGVtZW50LWJhc2UtdHlwZSI+Ci0gIDx4czpzaW1wbGVDb250ZW50PgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4c2w6dmVyc2lvbmVkLWVsZW1lbnQtdHlwZSI+Ci0gICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6c2ltcGxlQ29udGVudD4KLTwveHM6Y29tcGxleFR5cGU+Ci0KLTx4czplbGVtZW50IG5hbWU9InRleHQiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4c2w6aW5zdHJ1Y3Rpb24iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDp0ZXh0LWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLW91dHB1dC1lc2NhcGluZyIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ibm8iLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybS1lbGVtZW50LWJhc2UtdHlwZSI+Ci0gIDx4czpjb21wbGV4Q29udGVudD4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOmVsZW1lbnQtb25seS12ZXJzaW9uZWQtZWxlbWVudC10eXBlIj4KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6ZGVjaW1hbCIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gIDwveHM6Y29tcGxleENvbnRlbnQ+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm0iPgotICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6dHJhbnNmb3JtLWVsZW1lbnQtYmFzZS10eXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmltcG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzbDpkZWNsYXJhdGlvbiIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4c2w6dmFyaWFibGUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHNsOnBhcmFtIi8+ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4gPCEtLSB3ZWFrZXIgdGhhbiBYU0xUIDEuMCAtLT4KLSAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LXZhbGlkYXRpb24iIHR5cGU9InhzbDp2YWxpZGF0aW9uLXN0cmlwLW9yLXByZXNlcnZlIiBkZWZhdWx0PSJzdHJpcCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlucHV0LXR5cGUtYW5ub3RhdGlvbnMiIHR5cGU9InhzbDppbnB1dC10eXBlLWFubm90YXRpb25zLXR5cGUiIGRlZmF1bHQ9InVuc3BlY2lmaWVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1vZiIgc3Vic3RpdHV0aW9uR3JvdXA9InhzbDppbnN0cnVjdGlvbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbGVjdCIgdHlwZT0ieHNsOmV4cHJlc3Npb24iLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXBhcmF0b3IiIHR5cGU9InhzbDphdnQiLz4gICAgICAgICAgICAKLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLW91dHB1dC1lc2NhcGluZyIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ibm8iLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci0KLTx4czplbGVtZW50IG5hbWU9InZhcmlhYmxlIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFzIiB0eXBlPSJ4c2w6c2VxdWVuY2UtdHlwZSIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPHhzOmVsZW1lbnQgbmFtZT0id2hlbiI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9InRydWUiPgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4c2w6c2VxdWVuY2UtY29uc3RydWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRlc3QiIHR5cGU9InhzbDpleHByZXNzaW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotCi08eHM6ZWxlbWVudCBuYW1lPSJ3aXRoLXBhcmFtIj4KLSAgPHhzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0idHJ1ZSI+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzbDpzZXF1ZW5jZS1jb25zdHJ1Y3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNsOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VsZWN0IiB0eXBlPSJ4c2w6ZXhwcmVzc2lvbiIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFzIiB0eXBlPSJ4c2w6c2VxdWVuY2UtdHlwZSIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR1bm5lbCIgdHlwZT0ieHNsOnllcy1vci1ubyIvPiAgIAotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEM6IGRlZmluaXRpb24gb2YgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMKLSAgICAKLSAgICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBkZWZpbmUgdGhlIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzCi0gICAgcGVybWlzc2libGUgaW4gYSBzdHlsZXNoZWV0LgotICAgIAotICAgIChhKSBkbyBub3RoaW5nLiBUaGlzIGFsbG93cyBhbnkgZWxlbWVudCB0byBiZSB1c2VkIGFzIGEgbGl0ZXJhbAotICAgICAgICByZXN1bHQgZWxlbWVudCwgcHJvdmlkZWQgaXQgaXMgbm90IGluIHRoZSBYU0xUIG5hbWVzcGFjZQotICAgIAotICAgIChiKSBkZWNsYXJlIGFsbCBwZXJtaXR0ZWQgbGl0ZXJhbCByZXN1bHQgZWxlbWVudHMgYXMgbWVtYmVycwotICAgICAgICBvZiB0aGUgeHNsOmxpdGVyYWwtcmVzdWx0LWVsZW1lbnQgc3Vic3RpdHV0aW9uIGdyb3VwCi0gICAgICAgIAotICAgIChjKSByZWRlZmluZSB0aGUgbW9kZWwgZ3JvdXAgeHNsOnJlc3VsdC1lbGVtZW50cyB0byBhY2NvbW1vZGF0ZQotICAgICAgICBhbGwgcGVybWl0dGVkIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnRzLgotICAgICAgICAKLSAgICBMaXRlcmFsIHJlc3VsdCBlbGVtZW50cyBhcmUgYWxsb3dlZCB0byB0YWtlIGNlcnRhaW4gYXR0cmlidXRlcwotICAgIGluIHRoZSBYU0xUIG5hbWVzcGFjZS4gVGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIGF0dHJpYnV0ZSBncm91cAotICAgIGxpdGVyYWwtcmVzdWx0LWVsZW1lbnQtYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIGluY2x1ZGVkIGluIHRoZQotICAgIGRlZmluaXRpb24gb2YgYW55IGxpdGVyYWwgcmVzdWx0IGVsZW1lbnQuCi0gICAgCi0gIDwveHM6ZG9jdW1lbnRhdGlvbj4KLTwveHM6YW5ub3RhdGlvbj4gICAKLTwhLS0gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysgLS0+Ci0KLTx4czplbGVtZW50IG5hbWU9ImxpdGVyYWwtcmVzdWx0LWVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0KLTx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJsaXRlcmFsLXJlc3VsdC1lbGVtZW50LWF0dHJpYnV0ZXMiPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29sbGF0aW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDp1cmktbGlzdCIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpwcmVmaXhlcyIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpwcmVmaXhlcyIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoLWRlZmF1bHQtbmFtZXNwYWNlIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzOmFueVVSSSIvPiAgICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmhlcml0LW5hbWVzcGFjZXMiIGZvcm09InF1YWxpZmllZCIgdHlwZT0ieHNsOnllcy1vci1ubyIgZGVmYXVsdD0ieWVzIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWF0dHJpYnV0ZS1zZXRzIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpRTmFtZXMiIGRlZmF1bHQ9IiIvPgotICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS13aGVuIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDpleHByZXNzaW9uIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgZm9ybT0icXVhbGlmaWVkIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgZm9ybT0icXVhbGlmaWVkIiB0eXBlPSJ4c2w6UU5hbWUiLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiBmb3JtPSJxdWFsaWZpZWQiIHR5cGU9InhzbDp2YWxpZGF0aW9uLXR5cGUiLz4KLTwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLTx4czpncm91cCBuYW1lPSJyZXN1bHQtZWxlbWVudHMiPgotICA8eHM6Y2hvaWNlPgotICAgIDx4czplbGVtZW50IHJlZj0ieHNsOmxpdGVyYWwtcmVzdWx0LWVsZW1lbnQiLz4KLSAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIi8+Ci0gICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjbG9jYWwiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPgotICA8L3hzOmNob2ljZT4KLTwveHM6Z3JvdXA+Ci0KLQotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLTx4czphbm5vdGF0aW9uPgotICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICBQQVJUIEQ6IGRlZmluaXRpb25zIG9mIHNpbXBsZSB0eXBlcyB1c2VkIGluIHN0eWxlc2hlZXQgYXR0cmlidXRlcyAKLSAgPC94czpkb2N1bWVudGF0aW9uPgotPC94czphbm5vdGF0aW9uPiAgIAotPCEtLSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyAtLT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iYXZ0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGlzIHR5cGUgaXMgdXNlZCBmb3IgYWxsIGF0dHJpYnV0ZXMgdGhhdCBhbGxvdyBhbiBhdHRyaWJ1dGUgdmFsdWUgdGVtcGxhdGUuCi0gICAgICBUaGUgZ2VuZXJhbCBydWxlcyBmb3IgdGhlIHN5bnRheCBvZiBhdHRyaWJ1dGUgdmFsdWUgdGVtcGxhdGVzLCBhbmQgdGhlIHNwZWNpZmljCi0gICAgICBydWxlcyBmb3IgZWFjaCBzdWNoIGF0dHJpYnV0ZSwgYXJlIGRlc2NyaWJlZCBpbiB0aGUgWFNMVCAyLjAgUmVjb21tZW5kYXRpb24uCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iY2hhciI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBzdHJpbmcgY29udGFpbmluZyBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgIDx4czpsZW5ndGggdmFsdWU9IjEiLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iZXhwcmVzc2lvbiI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQW4gWFBhdGggMi4wIGV4cHJlc3Npb24uCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOnBhdHRlcm4gdmFsdWU9Ii4rIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImlucHV0LXR5cGUtYW5ub3RhdGlvbnMtdHlwZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRGVzY3JpYmVzIGhvdyB0eXBlIGFubm90YXRpb25zIGluIHNvdXJjZSBkb2N1bWVudHMgYXJlIGhhbmRsZWQuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaXAiLz4gICAKLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuc3BlY2lmaWVkIi8+ICAgICAgICAKLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0ibGV2ZWwiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBsZXZlbCBhdHRyaWJ1dGUgb2YgeHNsOm51bWJlcjogCi0gICAgICBvbmUgb2Ygc2luZ2xlLCBtdWx0aXBsZSwgb3IgYW55LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNpbmdsZSIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibXVsdGlwbGUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFueSIvPgotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJtb2RlIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGUgbW9kZSBhdHRyaWJ1dGUgb2YgeHNsOmFwcGx5LXRlbXBsYXRlczogCi0gICAgICBlaXRoZXIgYSBRTmFtZSwgb3IgI2N1cnJlbnQsIG9yICNkZWZhdWx0LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzbDpRTmFtZSI+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNkZWZhdWx0Ii8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2N1cnJlbnQiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJtb2RlcyI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIG1vZGUgYXR0cmlidXRlIG9mIHhzbDp0ZW1wbGF0ZTogCi0gICAgICBlaXRoZXIgYSBsaXN0LCBlYWNoIG1lbWJlciBiZWluZyBlaXRoZXIgYSBRTmFtZSBvciAjZGVmYXVsdDsKLSAgICAgIG9yIHRoZSB2YWx1ZSAjYWxsCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czp1bmlvbj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpsaXN0PgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzbDpRTmFtZSI+Ci0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNkZWZhdWx0Ii8+Ci0gICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgPC94czp1bmlvbj4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgPC94czpsaXN0PgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gIDwveHM6dW5pb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Im5hbWV0ZXN0cyI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgQSBsaXN0IG9mIE5hbWVUZXN0cywgYXMgZGVmaW5lZCBpbiB0aGUgWFBhdGggMi4wIFJlY29tbWVuZGF0aW9uLgotICAgICAgRWFjaCBOYW1lVGVzdCBpcyBlaXRoZXIgYSBRTmFtZSwgb3IgIioiLCBvciAicHJlZml4OioiLCBvciAiKjpsb2NhbG5hbWUiCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpsaXN0PgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2w6UU5hbWUiPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxpXGMqOlwqIi8+Ci0gICAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iXCo6XGlcYyoiLz4gICAgICAgICAgICAKLSAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICA8L3hzOnVuaW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czpsaXN0PgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwcmVmaXhlcyI+Ci0gIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpOQ05hbWUiLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0icHJlZml4LWxpc3Qtb3ItYWxsIj4KLSAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2w6cHJlZml4LWxpc3QiPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLSAgICAgIAotPHhzOnNpbXBsZVR5cGUgbmFtZT0icHJlZml4LWxpc3QiPgotICA8eHM6bGlzdCBpdGVtVHlwZT0ieHNsOnByZWZpeC1vci1kZWZhdWx0Ii8+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Im1ldGhvZCI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgVGhlIG1ldGhvZCBhdHRyaWJ1dGUgb2YgeHNsOm91dHB1dDoKLSAgICAgIEVpdGhlciBvbmUgb2YgdGhlIHJlY29nbml6ZWQgbmFtZXMgInhtbCIsICJ4aHRtbCIsICJodG1sIiwgInRleHQiLAotICAgICAgb3IgYSBRTmFtZSB0aGF0IG11c3QgaW5jbHVkZSBhIHByZWZpeC4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnVuaW9uPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSI+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieG1sIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieGh0bWwiLz4KLSAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJodG1sIi8+Ci0gICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGV4dCIvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOlFOYW1lIj4KLSAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxjKjpcYyoiLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICA8L3hzOnVuaW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJwYXR0ZXJuIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIG1hdGNoIHBhdHRlcm4gYXMgZGVmaW5lZCBpbiB0aGUgWFNMVCAyLjAgUmVjb21tZW5kYXRpb24uCi0gICAgICBUaGUgc3ludGF4IGZvciBwYXR0ZXJucyBpcyBhIHJlc3RyaWN0ZWQgZm9ybSBvZiB0aGUgc3ludGF4IGZvcgotICAgICAgWFBhdGggMi4wIGV4cHJlc3Npb25zLgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHNsOmV4cHJlc3Npb24iLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0icHJlZml4LW9yLWRlZmF1bHQiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEVpdGhlciBhIG5hbWVzcGFjZSBwcmVmaXgsIG9yICNkZWZhdWx0LgotICAgICAgVXNlZCBpbiB0aGUgeHNsOm5hbWVzcGFjZS1hbGlhcyBlbGVtZW50LgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOk5DTmFtZSI+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNkZWZhdWx0Ii8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czp1bmlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0iUU5hbWVzIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIGxpc3Qgb2YgUU5hbWVzLgotICAgICAgVXNlZCBpbiB0aGUgW3hzbDpddXNlLWF0dHJpYnV0ZS1zZXRzIGF0dHJpYnV0ZSBvZiB2YXJpb3VzIGVsZW1lbnRzLAotICAgICAgYW5kIGluIHRoZSBjZGF0YS1zZWN0aW9uLWVsZW1lbnRzIGF0dHJpYnV0ZSBvZiB4c2w6b3V0cHV0Ci0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpsaXN0IGl0ZW1UeXBlPSJ4c2w6UU5hbWUiLz4gICAgICAgICAgCi08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9IlFOYW1lIj4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBIFFOYW1lLgotICAgICAgVGhpcyBzY2hlbWEgZG9lcyBub3QgdXNlIHRoZSBidWlsdC1pbiB0eXBlIHhzOlFOYW1lLCBidXQgcmF0aGVyIGRlZmluZXMgaXRzIG93bgotICAgICAgUU5hbWUgdHlwZS4gQWx0aG91Z2ggeHM6UU5hbWUgd291bGQgZGVmaW5lIHRoZSBjb3JyZWN0IHZhbGlkYXRpb24gb24gdGhlc2UgYXR0cmlidXRlcywKLSAgICAgIGEgc2NoZW1hIHByb2Nlc3NvciB3b3VsZCBleHBhbmQgdW5wcmVmaXhlZCBRTmFtZXMgaW5jb3JyZWN0bHkgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIFBTVkksCi0gICAgICBiZWNhdXNlIChhcyBkZWZpbmVkIGluIFhNTCBTY2hlbWEgZXJyYXRhKSBhbiB1bnByZWZpeGVkIHhzOlFOYW1lIGlzIGFzc3VtZWQgdG8gYmUgaW4KLSAgICAgIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgd2hpY2ggaXMgbm90IHRoZSBjb3JyZWN0IGFzc3VtcHRpb24gZm9yIFhTTFQuCi0gICAgICBUaGUgZGF0YSB0eXBlIGlzIGRlZmluZWQgYXMgYSByZXN0cmljdGlvbiBvZiB0aGUgYnVpbHQtaW4gdHlwZSBOYW1lLCByZXN0cmljdGVkCi0gICAgICBzbyB0aGF0IGl0IGNhbiBvbmx5IGNvbnRhaW4gb25lIGNvbG9uIHdoaWNoIG11c3Qgbm90IGJlIHRoZSBmaXJzdCBvciBsYXN0IGNoYXJhY3Rlci4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5hbWUiPgotICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIoW146XSs6KT9bXjpdKyIvPiAgICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPiAgICAgICAgCi08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9InNlcXVlbmNlLXR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIFRoZSBkZXNjcmlwdGlvbiBvZiBhIGRhdGEgdHlwZSwgY29uZm9ybWluZyB0byB0aGUKLSAgICAgIFNlcXVlbmNlVHlwZSBwcm9kdWN0aW9uIGRlZmluZWQgaW4gdGhlIFhQYXRoIDIuMCBSZWNvbW1lbmRhdGlvbgotICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgPC94czphbm5vdGF0aW9uPgotICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIuKyIvPiAgICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ1cmktbGlzdCI+Ci0gIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czphbnlVUkkiLz4KLTwveHM6c2ltcGxlVHlwZT4KLQotPHhzOnNpbXBsZVR5cGUgbmFtZT0idmFsaWRhdGlvbi1zdHJpcC1vci1wcmVzZXJ2ZSI+Ci0gIDx4czphbm5vdGF0aW9uPgotICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgRGVzY3JpYmVzIGRpZmZlcmVudCB3YXlzIG9mIHR5cGUtYW5ub3RhdGluZyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzbDp2YWxpZGF0aW9uLXR5cGUiPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmlwIi8+ICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ2YWxpZGF0aW9uLXR5cGUiPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIERlc2NyaWJlcyBkaWZmZXJlbnQgd2F5cyBvZiB0eXBlLWFubm90YXRpbmcgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpY3QiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxheCIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmlwIi8+ICAgIAotICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotCi08eHM6c2ltcGxlVHlwZSBuYW1lPSJ5ZXMtb3Itbm8iPgotICA8eHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIE9uZSBvZiB0aGUgdmFsdWVzICJ5ZXMiIG9yICJubyIuCi0gICAgPC94czpkb2N1bWVudGF0aW9uPgotICA8L3hzOmFubm90YXRpb24+Ci0gIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+Ci0gICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gIDwveHM6cmVzdHJpY3Rpb24+Ci08L3hzOnNpbXBsZVR5cGU+Ci0KLTx4czpzaW1wbGVUeXBlIG5hbWU9Inllcy1vci1uby1vci1vbWl0Ij4KLSAgPHhzOmFubm90YXRpb24+Ci0gICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBPbmUgb2YgdGhlIHZhbHVlcyAieWVzIiBvciAibm8iIG9yICJvbWl0Ii4KLSAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gIDwveHM6YW5ub3RhdGlvbj4KLSAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9taXQiLz4KLSAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLQotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzYwMjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1idWlsZC54bWwKLUBkb3QKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOWQwYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3YmI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEphbiAwMyAyMjoyNDowMSBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhMDA4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI0ZyaSBNYXkgMDkgMTU6MzI6MzYgQlNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3YjQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBNYXkgMDkgMTU6MzI6MzQgQlNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ4NTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMDk6MDQ6NDMgRVNUIDIwMDgKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQ0ZjQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlswLjUuMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNvbnNvbGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTtidW5kbGUtdmVyc2lvbj0iWzAuNS4wLDEuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmJyZWFrcG9pbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5mb3JtYXR0ZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5vdXRwdXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnJlc29sdmVyO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGRhMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMvYnJrcF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL2Jya3Bfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzMWZlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMvYnJrcF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL2xvY2FsdmFyaWFibGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy9sb2NhbHZhcmlhYmxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDRiMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL2xvY2FsdmFyaWFibGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy9vcGVyYXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL29wZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NWQ5ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL29wZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMvc2FtcGxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL3hzbHRfbGF1bmNoLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy94c2x0X2xhdW5jaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTE1ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL3hzbHRfbGF1bmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy94c2x0X291dHB1dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMveHNsdF9vdXRwdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWZiMDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9pY29ucy94c2x0X291dHB1dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMveHNsdF9wcm9jZXNzb3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL2ljb25zL3hzbHRfcHJvY2Vzc29yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3MTI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvaWNvbnMveHNsdF9wcm9jZXNzb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTNhYTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkKLUJ1bmRsZS1OYW1lLjAgPSBYU0wgRGVidWdnZXIgVUkgKEluY3ViYXRpbmcpCi1wYWdlLm5hbWUuMSA9IEphdmEgUHJvY2Vzc29ycwotcGFnZS5uYW1lLjIgPSBGZWF0dXJlcwotcGFnZS5uYW1lLjMgPSBPdXRwdXQgUHJvcGVydGllcwotbGF1bmNoTW9kZS5kZXNjcmlwdGlvbi4wID0gQ3JlYXRlIGEgY29uZmlndXJhdGlvbiB0byBkZWJ1ZyBhbiBYU0xUIHRyYW5zZm9ybWF0aW9uCi1sYXVuY2hNb2RlLmRlc2NyaXB0aW9uLjEgPSBDcmVhdGUgYSBjb25maWd1cmF0aW9uIHRvIHJ1biBhbiBYU0xUIHRyYW5zZm9ybWF0aW9uCi1jb250ZXh0LmRlc2NyaXB0aW9uLjAgPSBDb250ZXh0IGZvciBkZWJ1Z2dpbmcgWFNMVAotY29udGV4dC5uYW1lLjAgPSBYU0xUIERlYnVnZ2luZwotc2hvcnRjdXQubGFiZWwuMCA9IFhTTCBUcmFuc2Zvcm1hdGlvbgotc2hvcnRjdXQubGFiZWwuMSA9IFhTTFQgVHJhbnNmb3JtYXRpb24KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1kZXNjcmlwdGlvbi5kZXNjcmlwdGlvbi4wID0gUnVuIGFuIFhTTFQgdHJhbnNmb3JtYXRpb24gdXNpbmcgdGhlIHNlbGVjdGVkIGZpbGUocykKLWRlc2NyaXB0aW9uLmRlc2NyaXB0aW9uLjEgPSBEZWJ1ZyBhbiBYU0xUIHRyYW5zZm9ybWF0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZCBmaWxlKHMpCi1kZXNjcmlwdGlvbi5kZXNjcmlwdGlvbi4yID0gUHJvZmlsZSBhbiBYU0xUIHRyYW5zZm9ybWF0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZCBmaWxlKHMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0ODE1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wcmVmZXJlbmNlcy5qYXZhIgotCQkJbmFtZT0iJXBhZ2UubmFtZS4xIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuamF2YSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzLkZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS5wYWdlMSIgbmFtZT0iJXBhZ2UubmFtZS4yIiAvPgotCQk8cGFnZQotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuamF2YSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzLk91dHB1dFByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkub3V0cHV0IiBuYW1lPSIlcGFnZS5uYW1lLjMiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLQkJPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5wZXJzcGVjdGl2ZSI+Ci0JCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5kZWJ1Z0FjdGlvblNldCIgLz4KLQkJCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEFjdGlvblNldCIgLz4KLQkJCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmJyZWFrcG9pbnRBY3Rpb25TZXQiIC8+Ci0JCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5wcm9maWxlQWN0aW9uU2V0IiAvPgotCQk8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2VzIj4KLQkJPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UgaWNvbj0iaWNvbnMveHNsdF9sYXVuY2guZ2lmIgotCQkJY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXBzIj4KLQkJPGxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMVFRhYkdyb3VwIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLnhzbHQiCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci0JCQk8bGF1bmNoTW9kZSBkZXNjcmlwdGlvbj0iJWxhdW5jaE1vZGUuZGVzY3JpcHRpb24uMCIKLQkJCQltb2RlPSJkZWJ1ZyIgcGVyc3BlY3RpdmU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnUGVyc3BlY3RpdmUiIC8+Ci0JCQk8bGF1bmNoTW9kZSBkZXNjcmlwdGlvbj0iJWxhdW5jaE1vZGUuZGVzY3JpcHRpb24uMSIKLQkJCQltb2RlPSJydW4iIHBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS53c3QueG1sLnBlcnNwZWN0aXZlIiAvPgotCQk8L2xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0IGRlc2NyaXB0aW9uPSIlY29udGV4dC5kZXNjcmlwdGlvbi4wIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkuY29udGV4dCIgbmFtZT0iJWNvbnRleHQubmFtZS4wIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmRlYnVnZ2luZyI+Ci0JCTwvY29udGV4dD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmRlYnVnTW9kZWxQcmVzZW50YXRpb25zIj4KLQkJPGRlYnVnTW9kZWxQcmVzZW50YXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLm1vZGVsLlhTTE1vZGVsUHJlc2VudGF0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTERlYnVnTW9kZWwiPgotCQk8L2RlYnVnTW9kZWxQcmVzZW50YXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hTaG9ydGN1dHMiPgotCQk8c2hvcnRjdXQKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMTGF1bmNoU2hvcnRjdXQiCi0gICAgICAgIGljb249Imljb25zL3hzbHRfbGF1bmNoLmdpZiIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkubGF1bmNoc2hvcnRjdXQiCi0gICAgICAgIGxhYmVsPSIlc2hvcnRjdXQubGFiZWwuMCIKLSAgICAgICAgbW9kZXM9InJ1biwgZGVidWcsIHByb2ZpbGUiPgotCQkJPGNvbnRleHR1YWxMYXVuY2g+Ci0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGU+Ci0JCQkJCQkJPGFkYXB0Ci0JCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCQkJPG9yPgotCQkJCQkJCQkJPHRlc3QKLQkJCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLQkJCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCQkJCQkJCQk8dGVzdAotCQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlIiAvPgotCQkJCQkJCQk8L29yPgotCQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2NvbnRleHR1YWxMYXVuY2g+Ci0JCSAgIDxkZXNjcmlwdGlvbgotCQkgICAgICAgICBkZXNjcmlwdGlvbj0iJWRlc2NyaXB0aW9uLmRlc2NyaXB0aW9uLjAiCi0JCSAgICAgICAgIG1vZGU9InJ1biI+Ci0JCSAgIDwvZGVzY3JpcHRpb24+Ci0JCSAgIDxkZXNjcmlwdGlvbgotCQkgICAgICAgICBkZXNjcmlwdGlvbj0iJWRlc2NyaXB0aW9uLmRlc2NyaXB0aW9uLjEiCi0JCSAgICAgICAgIG1vZGU9ImRlYnVnIj4KLQkJICAgPC9kZXNjcmlwdGlvbj4KLQkJICAgPGRlc2NyaXB0aW9uCi0JCSAgICAgICAgIGRlc2NyaXB0aW9uPSIlZGVzY3JpcHRpb24uZGVzY3JpcHRpb24uMiIKLQkJICAgICAgICAgbW9kZT0icHJvZmlsZSI+Ci0JCSAgIDwvZGVzY3JpcHRpb24+Ci0JCTwvc2hvcnRjdXQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkuZGVidWdNb2RlbENvbnRleHRCaW5kaW5ncyI+Ci0JCTxtb2RlbENvbnRleHRCaW5kaW5nCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkuY29udGV4dCIKLQkJCWRlYnVnTW9kZWxJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMRGVidWdNb2RlbCI+Ci0JCTwvbW9kZWxDb250ZXh0QmluZGluZz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb250ZXh0Vmlld0JpbmRpbmdzIj4KLQkJPGNvbnRleHRWaWV3QmluZGluZyBhdXRvT3Blbj0idHJ1ZSIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS5jb250ZXh0IgotCQkJdmlld0lkPSJvcmcuZWNsaXBzZS53c3QueG1sLnZpZXdzLlhQYXRoVmlldyI+Ci0JCTwvY29udGV4dFZpZXdCaW5kaW5nPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5icmVha3BvaW50Ij4KLQkJPGJyZWFrcG9pbnRDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpLnByb3ZpZGVycyI+Ci0JCQk8cHJvdmlkZXIgY29udGVudFR5cGVzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmJyZWFrcG9pbnQuWFNMQnJlYWtwb2ludFByb3ZpZGVyOip4c2wsKnhzbHQiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkuWFNMQnJlYWtwb2ludFByb3ZpZGVyIiAvPgotCQkJCTwhLS0gVE9ETyBhZGQgdGhpcyBiYWNrIGluIHdoZW4gd2UgY2FuIGRvIHNvbWV0aGluZyB3aXRoIGJyZWFrcG9pbnRzIG9uIFhNTCBmaWxlcyAtLT4KLTwhLS0JCQk8cHJvdmlkZXIgY29udGVudFR5cGVzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2Usb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5icmVha3BvaW50LlhTTEJyZWFrcG9pbnRQcm92aWRlcjoqeHNsLCp4c2x0LCp4bWwiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkuWFNMQnJlYWtwb2ludFByb3ZpZGVyIiAvPiAtLT4KLQkJPC9icmVha3BvaW50Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZUxpbmVUcmFja2VycyI+Ci0JCTxjb25zb2xlTGluZVRyYWNrZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTENvbnNvbGVMaW5lVHJhY2tlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTENvbnNvbGVMaW5lVHJhY2tlciIKLQkJCXByb2Nlc3NUeXBlPSJqYXZhIj4KLQkJPC9jb25zb2xlTGluZVRyYWNrZXI+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2RlYnVnL2ludGVybmFsL3V0aWwvWFNMRGVidWdQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9kZWJ1Zy9pbnRlcm5hbC91dGlsL1hTTERlYnVnUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmYzE0NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2RlYnVnL2ludGVybmFsL3V0aWwvWFNMRGVidWdQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIyMzU1NyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEhvbGdlciBWb29ybWFubiAtIEljb25zIGZvciBQcm9jZXNzb3IsIE91dHB1dCwgYW5kIExhdW5jaCB0YWJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBYU0wgRGVidWcgUGx1Z2lucwotICovCi1wdWJsaWMgY2xhc3MgWFNMRGVidWdQbHVnaW5JbWFnZXMgewotCi0JLyoqCi0JICogUGF0aCB0byB0aGUgWFNMVCBQcm9jZXNzb3IgIEltYWdlcyB1c2VkIGZvciBsYXVuY2ggY29uZmlndXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPQ0VTU09SX1RBQiA9ICJpY29ucy94c2x0X3Byb2Nlc3Nvci5naWYiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUGF0aCB0byB0aGUgWFNMVCBPdXRwdXQgSW1hZ2VzIHVzZWQgZm9yIGxhdW5jaCBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVVRQVVRfVEFCID0gImljb25zL3hzbHRfb3V0cHV0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBhdGggdG8gdGhlIFhTTFQgTGF1bmNoIEltYWdlcyB1c2VkIGZvciBsYXVuY2ggY29uZmlndXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTUFJTl9UQUIgPSAiaWNvbnMveHNsdF9sYXVuY2guZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2RlYnVnL2ludGVybmFsL3V0aWwvWFNMUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9kZWJ1Zy9pbnRlcm5hbC91dGlsL1hTTFBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg2ODQzYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2RlYnVnL2ludGVybmFsL3V0aWwvWFNMUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAyMTM4NDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGRhdmlkIGNhcnZlciBiYXNlZCBvbiB3b3JrIGJ5IGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYU0xQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgWFNMUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYU0xQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IFhTTFBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8vIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkgewotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogSWYgdGhlIGltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgYXQKLQkgKiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYW4gaW1hZ2UKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL0Fic3RyYWN0VGFibGVCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL0Fic3RyYWN0VGFibGVCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI0ZDhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9BYnN0cmFjdFRhYmxlQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogQW4gPGNvZGU+QWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiPC9jb2RlPiBzcGVjaWFsaXNlZCBmb3IgYmxvY2tzIHRoYXQKLSAqIGNvbnRhaW4gYSB0YWJsZS4gVGhpcyBhYnN0cmFjdCBjbGFzcyBjb252ZW5pZW50bHkgc2F2ZXMgYW5kIHJlc3RvcmVzIHRoZSB0YWJsZSdzCi0gKiBjb2x1bW4gc2V0dGluZ3MuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFibGVCbG9jayBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYgotewotCXByaXZhdGUgaW50IGZTb3J0Q29sdW1uOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFRhYmxlIGdldFRhYmxlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFF1YWxpZmllcigpOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U29ydENvbHVtbihpbnQgY29sdW1uKQotCXsKLQkJZlNvcnRDb2x1bW4gPSBjb2x1bW47Ci0JfQotCi0JLyoqCi0JICogUGVyc2lzdCB0YWJsZSBzZXR0aW5ncyBpbnRvIHRoZSBnaXZlIGRpYWxvZyBzdG9yZSwgcHJlZml4ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUNvbHVtblNldHRpbmdzKCkKLQl7Ci0JCWludCBjb2x1bW5Db3VudCA9IGdldFRhYmxlKCkuZ2V0Q29sdW1uQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKQotCQl7Ci0JCQlnZXREaWFsb2dTZXR0aW5ncygpLnB1dChnZXRRdWFsaWZpZXIoKSArICIuY29sdW1uV2lkdGgiICsgaSwgZ2V0VGFibGUoKS5nZXRDb2x1bW4oaSkuZ2V0V2lkdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlnZXREaWFsb2dTZXR0aW5ncygpLnB1dChnZXRRdWFsaWZpZXIoKSArICIuc29ydENvbHVtbiIsIGZTb3J0Q29sdW1uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdGFibGUgc2V0dGluZ3MgZnJvbSB0aGUgZ2l2ZW4gZGlhbG9nIHN0b3JlIHVzaW5nIHRoZSBnaXZlbiBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZUNvbHVtblNldHRpbmdzKCkKLQl7Ci0JCWdldFRhYmxlKCkubGF5b3V0KHRydWUpOwotCQlyZXN0b3JlQ29sdW1uV2lkdGhzKGdldERpYWxvZ1NldHRpbmdzKCksIGdldFF1YWxpZmllcigpKTsKLQkJaW50IGNvbCA9IDA7Ci0JCXRyeQotCQl7Ci0JCQljb2wgPSBnZXREaWFsb2dTZXR0aW5ncygpLmdldEludChnZXRRdWFsaWZpZXIoKSArICIuc29ydENvbHVtbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQljb2wgPSAxOwotCQl9Ci0JCXNldFNvcnRDb2x1bW4oY29sKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzdG9yZUNvbHVtbldpZHRocyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MsIFN0cmluZyBxdWFsaWZpZXIpCi0JewotCQlpbnQgY29sdW1uQ291bnQgPSBnZXRUYWJsZSgpLmdldENvbHVtbkNvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykKLQkJewotCQkJaW50IHdpZHRoID0gLTE7Ci0JCQl0cnkKLQkJCXsKLQkJCQl3aWR0aCA9IHNldHRpbmdzLmdldEludChxdWFsaWZpZXIgKyAiLmNvbHVtbldpZHRoIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQl9Ci0KLQkJCWlmICh3aWR0aCA+IDApCi0JCQkJZ2V0VGFibGUoKS5nZXRDb2x1bW4oaSkuc2V0V2lkdGgod2lkdGgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCQlpZiAoZ2V0VGFibGUoKSAhPSBudWxsICYmICFnZXRUYWJsZSgpLmlzRGlzcG9zZWQoKSkKLQkJCXNhdmVDb2x1bW5TZXR0aW5ncygpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3ZTg1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBNZXNzYWdlcyBmb3IgdGhlIGRlYnVnLnVpIHBhY2thZ2UuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpCi0JewotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBtZXNzYWdlIGtleQotCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLQkJewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9SZXNvdXJjZVNlbGVjdGlvbkJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvUmVzb3VyY2VTZWxlY3Rpb25CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWQzNmU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9SZXNvdXJjZVNlbGVjdGlvbkJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLklTdHJpbmdWYXJpYWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLlN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZUNvbXBhcmF0b3I7Ci0KLS8qKgotICogQSBibG9jayB0aGF0IHNob3dzIGEgdGV4dCBib3ggd2l0aCBidXR0b25zIGZvciBicm93c2luZyB3b3Jrc3BhY2Ugb3IgdGhlIGZpbGVzeXN0ZW0KLSAqIGluIG9yZGVyIHRvIHBvcHVsYXRlIHRoZSB0ZXh0IGJveCB3aXRoIGEgZmlsZSBwYXRoLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZVNlbGVjdGlvbkJsb2NrIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVCA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgR1JPVVBfTkFNRSA9IDM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVVNFX0RFRkFVTFRfUkFESU8gPSA0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVTRV9PVEhFUl9SQURJTyA9IDU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUT1JZX0RJQUxPR19NRVNTQUdFID0gNjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXT1JLU1BBQ0VfRElBTE9HX01FU1NBR0UgPSA3OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZBUklBQkxFU19CVVRUT04gPSA4OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTEVfU1lTVEVNX0JVVFRPTiA9IDk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgV09SS1NQQUNFX0JVVFRPTiA9IDEwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdPUktTUEFDRV9ESUFMT0dfVElUTEUgPSAxMTsKLQotCXByb3RlY3RlZCBCdXR0b24gZldvcmtzcGFjZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZGaWxlU3lzdGVtQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZlZhcmlhYmxlc0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHVzZURlZmF1bHRDaGVja0J1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCByZXNvdXJjZVRleHQ7Ci0JcHJvdGVjdGVkIFdpZGdldExpc3RlbmVyIHdpZGdldExpc3RlbmVyID0gbmV3IFdpZGdldExpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBmTGF1bmNoQ29uZmlndXJhdGlvbjsKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzaG93RGVmYXVsdDsKLQlwcml2YXRlIGZpbmFsIGludCByZXNvdXJjZVR5cGU7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIG11c3RFeGlzdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRPdXRwdXRGaWxlOwotCXByb3RlY3RlZCBTdHJpbmcgb3V0cHV0RmlsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVMYWJlbCA9IE1lc3NhZ2VzLmdldFN0cmluZygiUmVzb3VyY2VTZWxlY3Rpb25CbG9jay4wIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpCi0JewotCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pCi0JCXsKLQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDApCi0JCQl7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCWlmIChyZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLkZPTERFUiAmJiAhKHNlbGVjdGlvbltpXSBpbnN0YW5jZW9mIElGb2xkZXIpKQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuRklMRSAmJiAhKHNlbGVjdGlvbltpXSBpbnN0YW5jZW9mIElGaWxlKSkKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotCi0JY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLQkJewotCQkJdGV4dE1vZGlmaWVkKCk7Ci0JCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IGZXb3Jrc3BhY2VCdXR0b24pCi0JCQl7Ci0JCQkJaGFuZGxlV29ya3NwYWNlUmVzb3VyY2VCcm93c2VCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkJZWxzZSBpZiAoc291cmNlID09IGZGaWxlU3lzdGVtQnV0dG9uKQotCQkJewotCQkJCWhhbmRsZUV4dGVybmFsUmVzb3VyY2VCcm93c2VCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkJZWxzZSBpZiAoc291cmNlID09IGZWYXJpYWJsZXNCdXR0b24pCi0JCQl7Ci0JCQkJaGFuZGxlUmVzb3VyY2VWYXJpYWJsZXNCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkJZWxzZSBpZiAoc291cmNlID09IHVzZURlZmF1bHRDaGVja0J1dHRvbikKLQkJCXsKLQkJCQl1cGRhdGVSZXNvdXJjZVRleHQodXNlRGVmYXVsdENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhbWUgYXMgPGNvZGU+bmV3IFJlc291cmNlU2VsZWN0aW9uQmxvY2sodHJ1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIFJlc291cmNlU2VsZWN0aW9uQmxvY2soKQotCXsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTYW1lIGFzIDxjb2RlPm5ldyBSZXNvdXJjZVNlbGVjdGlvbkJsb2NrKElSZXNvdXJjZS5GT0xERVIsc2hvd0RlZmF1bHQpPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBzaG93RGVmYXVsdCB0cnVlIGlmIHRoaXMgc2hvdWxkIGhhdmUgYSAnU2hvdyBEZWZhdWx0JyBidXR0b24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25CbG9jayhib29sZWFuIHNob3dEZWZhdWx0KQotCXsKLQkJdGhpcyhJUmVzb3VyY2UuRk9MREVSLCBzaG93RGVmYXVsdCk7Ci0JfQotCi0JLyoqCi0JICogU2FtZSBhcyA8Y29kZT5uZXcgUmVzb3VyY2VTZWxlY3Rpb25CbG9jayhyZXNvdXJjZVR5cGUsc2hvd0RlZmF1bHQsdHJ1ZSk8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlVHlwZSB0aGUgdHlwZSBvZiByZXNvdXJjZSB0byBzZWxlY3QgLSBJUmVzb3VyY2UuRk9MREVSIG9yIElSZXNvdXJjZS5GSUxFCi0JICogQHBhcmFtIHNob3dEZWZhdWx0IHRydWUgaWYgdGhpcyBzaG91bGQgaGF2ZSBhICdTaG93IERlZmF1bHQnIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNlbGVjdGlvbkJsb2NrKGludCByZXNvdXJjZVR5cGUsIGJvb2xlYW4gc2hvd0RlZmF1bHQpCi0JewotCQl0aGlzKHJlc291cmNlVHlwZSwgc2hvd0RlZmF1bHQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFNhbWUgYXMgPGNvZGU+bmV3IFJlc291cmNlU2VsZWN0aW9uQmxvY2socmVzb3VyY2VUeXBlLHNob3dEZWZhdWx0LHJlcXVpcmVkLHRydWUpPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVR5cGUgdGhlIHR5cGUgb2YgcmVzb3VyY2UgdG8gc2VsZWN0IC0gSVJlc291cmNlLkZPTERFUiBvciBJUmVzb3VyY2UuRklMRQotCSAqIEBwYXJhbSBzaG93RGVmYXVsdCB0cnVlIGlmIHRoaXMgc2hvdWxkIGhhdmUgYSAnU2hvdyBEZWZhdWx0JyBidXR0b24KLQkgKiBAcGFyYW0gcmVxdWlyZWQgdHJ1ZSBpZiBhIGJsYW5rIHRleHQgYm94IGlzIGludmFsaWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25CbG9jayhpbnQgcmVzb3VyY2VUeXBlLCBib29sZWFuIHNob3dEZWZhdWx0LCBib29sZWFuIHJlcXVpcmVkKQotCXsKLQkJdGhpcyhyZXNvdXJjZVR5cGUsIHNob3dEZWZhdWx0LCByZXF1aXJlZCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlVHlwZSB0aGUgdHlwZSBvZiByZXNvdXJjZSB0byBzZWxlY3QgLSBJUmVzb3VyY2UuRk9MREVSIG9yIElSZXNvdXJjZS5GSUxFCi0JICogQHBhcmFtIHNob3dEZWZhdWx0IHRydWUgaWYgdGhpcyBzaG91bGQgaGF2ZSBhICdTaG93IERlZmF1bHQnIGJ1dHRvbgotCSAqIEBwYXJhbSByZXF1aXJlZCB0cnVlIGlmIGEgYmxhbmsgdGV4dCBib3ggaXMgaW52YWxpZAotCSAqIEBwYXJhbSBtdXN0RXhpc3QgdHJ1ZSBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgbXVzdCBhbHJlYWR5IGV4aXN0Ci0JICovCi0JcHVibGljIFJlc291cmNlU2VsZWN0aW9uQmxvY2soaW50IHJlc291cmNlVHlwZSwgYm9vbGVhbiBzaG93RGVmYXVsdCwgYm9vbGVhbiByZXF1aXJlZCwgYm9vbGVhbiBtdXN0RXhpc3QpCi0JewotCQlzdXBlcigpOwotCQl0aGlzLnNob3dEZWZhdWx0ID0gc2hvd0RlZmF1bHQ7Ci0JCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOwotCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCXRoaXMubXVzdEV4aXN0ID0gbXVzdEV4aXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCUNvbXBvc2l0ZSBncm91cCA9IGNyZWF0ZUNvbnRhaW5lcihwYXJlbnQpOwotCQlzZXRDb250cm9sKGdyb3VwKTsKLQkJY3JlYXRlQ29udGVudHMoZ3JvdXApOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChnZXRNZXNzYWdlKEdST1VQX05BTUUpKTsKLQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwLi4uCi0JCUdyaWRMYXlvdXQgZ3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncm91cExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JvdXBMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCWdyb3VwLnNldExheW91dChncm91cExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCQlncm91cC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCWNyZWF0ZUNoZWNrYm94QW5kVGV4dChwYXJlbnQpOwotCQljcmVhdGVCdXR0b25zKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hlY2tib3hBbmRUZXh0KENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlpZiAoc2hvd0RlZmF1bHQpCi0JCXsKLQkJCXVzZURlZmF1bHRDaGVja0J1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKHBhcmVudCwgZ2V0TWVzc2FnZShVU0VfREVGQVVMVF9SQURJTykpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJdXNlRGVmYXVsdENoZWNrQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQkJdXNlRGVmYXVsdENoZWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHdpZGdldExpc3RlbmVyKTsKLQkJfQotCi0JCUNvbXBvc2l0ZSBzcGVjaWZpY0ZpbGVDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlmIChzaG93RGVmYXVsdCkKLQkJCWxheW91dC5tYXJnaW5MZWZ0ID0gMjA7Ci0JCWVsc2UKLQkJCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXNwZWNpZmljRmlsZUNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3BlY2lmaWNGaWxlQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlpZiAoc2hvd0RlZmF1bHQpCi0JCXsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNwZWNpZmljRmlsZUNvbXAsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoZmlsZUxhYmVsKTsKLQkJfQotCi0JCXJlc291cmNlVGV4dCA9IG5ldyBUZXh0KHNwZWNpZmljRmlsZUNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzaG93RGVmYXVsdCA/IDEgOiAyOwotCQlyZXNvdXJjZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJlc291cmNlVGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlyZXNvdXJjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCS8vIGZpbGxlcgotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlidXR0b25Db21wLnNldExheW91dERhdGEoZ2QpOwotCQlidXR0b25Db21wLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJZldvcmtzcGFjZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uQ29tcCwgZ2V0TWVzc2FnZShXT1JLU1BBQ0VfQlVUVE9OKSwgbnVsbCk7Ci0JCWZXb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCi0JCWZGaWxlU3lzdGVtQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25Db21wLCBnZXRNZXNzYWdlKEZJTEVfU1lTVEVNX0JVVFRPTiksIG51bGwpOwotCQlmRmlsZVN5c3RlbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih3aWRnZXRMaXN0ZW5lcik7Ci0KLQkJZlZhcmlhYmxlc0J1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uQ29tcCwgZ2V0TWVzc2FnZShWQVJJQUJMRVNfQlVUVE9OKSwgbnVsbCk7Ci0JCWZWYXJpYWJsZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc291cmNlVGV4dChib29sZWFuIHVzZURlZmF1bHQpCi0JewotCQlpZiAodXNlRGVmYXVsdCkKLQkJewotCQkJcmVzb3VyY2VUZXh0LnNldFRleHQoZGVmYXVsdE91dHB1dEZpbGUgPT0gbnVsbCA/ICIiIDogZGVmYXVsdE91dHB1dEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXNvdXJjZVRleHQuc2V0VGV4dChvdXRwdXRGaWxlID09IG51bGwgPyAiIiA6IG91dHB1dEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVzb3VyY2VUZXh0LnNldEVuYWJsZWQoIXVzZURlZmF1bHQpOwotCQlmRmlsZVN5c3RlbUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJZlZhcmlhYmxlc0J1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJZldvcmtzcGFjZUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXh0ZXJuYWxSZXNvdXJjZUJyb3dzZUJ1dHRvblNlbGVjdGVkKCkKLQl7Ci0JCVN0cmluZyBjdXJyZW50V29ya2luZ0RpciA9IGdldFRleHQoKTsKLQkJU3RyaW5nIHNlbGVjdGVkID0gbnVsbDsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCQl7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKGdldE1lc3NhZ2UoRElSRUNUT1JZX0RJQUxPR19NRVNTQUdFKSk7Ci0JCQlpZiAoIWN1cnJlbnRXb3JraW5nRGlyLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoY3VycmVudFdvcmtpbmdEaXIpOwotCQkJCWlmIChwYXRoLmV4aXN0cygpKQotCQkJCXsKLQkJCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoY3VycmVudFdvcmtpbmdEaXIpOwotCQkJCX0KLQkJCX0KLQkJCXNlbGVjdGVkID0gZGlhbG9nLm9wZW4oKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoIWN1cnJlbnRXb3JraW5nRGlyLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoY3VycmVudFdvcmtpbmdEaXIpOwotCQkJCWlmIChwYXRoLmV4aXN0cygpKQotCQkJCXsKLQkJCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoY3VycmVudFdvcmtpbmdEaXIpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZ1tdIGZpbGVFeHRlbnNpb25zID0gZ2V0RmlsZUV4dGVuc2lvbnMoKTsKLQkJCWlmIChmaWxlRXh0ZW5zaW9ucyAhPSBudWxsKQotCQkJewotCQkJCVN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW2ZpbGVFeHRlbnNpb25zLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQl7Ci0JCQkJCVN0cmluZyBleHQgPSBmaWxlRXh0ZW5zaW9uc1tpXTsKLQkJCQkJZmlsdGVyRXh0ZW5zaW9uc1tpXSA9ICIqLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JCQl9Ci0JCQlzZWxlY3RlZCA9IGRpYWxvZy5vcGVuKCk7Ci0JCX0KLQkJaWYgKHNlbGVjdGVkICE9IG51bGwpCi0JCXsKLQkJCXJlc291cmNlVGV4dC5zZXRUZXh0KHNlbGVjdGVkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWxlRXh0ZW5zaW9ucygpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVXb3Jrc3BhY2VSZXNvdXJjZUJyb3dzZUJ1dHRvblNlbGVjdGVkKCkKLQl7Ci0JCUlQYXRoIHBhdGggPSBvcGVuV29ya3NwYWNlUmVzb3VyY2VEaWFsb2coKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCXNldFRleHQoIiR7d29ya3NwYWNlX2xvYzoiICsgcGF0aC50b1N0cmluZygpICsgIn0iKTsgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggb3BlbldvcmtzcGFjZVJlc291cmNlRGlhbG9nKCkKLQl7Ci0JCUlSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQkJZGlhbG9nLnNldFRpdGxlKGdldE1lc3NhZ2UoV09SS1NQQUNFX0RJQUxPR19USVRMRSkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShnZXRNZXNzYWdlKFdPUktTUEFDRV9ESUFMT0dfTUVTU0FHRSkpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChyZXNvdXJjZVR5cGUgIT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotCQkJCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBnZXRGaWxlRXh0ZW5zaW9ucygpOwotCQkJCWlmIChleHRlbnNpb25zID09IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCVN0cmluZyBmaWxlRXh0ID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGZpbGVFeHQgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWZvciAoU3RyaW5nIGV4dCA6IGV4dGVuc2lvbnMpCi0JCQkJCXsKLQkJCQkJCWlmIChmaWxlRXh0LmVxdWFsc0lnbm9yZUNhc2UoZXh0KSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gZ2V0UmVzb3VyY2VGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOwotCQlkaWFsb2cuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9uKGN1cnJlbnRSZXNvdXJjZSk7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKLQkJZGlhbG9nLnNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLQkJewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gKChJUmVzb3VyY2UpIGVsZW1lbnRzWzBdKS5nZXRGdWxsUGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgZ2V0UmVzb3VyY2VGaWx0ZXIoKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgd29ya3NwYWNlIGNvbnRhaW5lcixvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKQotCXsKLQkJU3RyaW5nIHBhdGggPSBnZXRUZXh0KCk7Ci0JCWlmIChwYXRoLmxlbmd0aCgpID4gMCkKLQkJewotCQkJSVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgoIiR7d29ya3NwYWNlX2xvYzoiKSkgIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlJU3RyaW5nVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJcGF0aCA9IG1hbmFnZXIucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihwYXRoLCBmYWxzZSk7Ci0JCQkJCWlmIChyZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLkZPTERFUikKLQkJCQkJewotCQkJCQkJSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSByb290LmZpbmRDb250YWluZXJzRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJCQkJaWYgKGNvbnRhaW5lcnMubGVuZ3RoID4gMCkKLQkJCQkJCXsKLQkJCQkJCQlyZXMgPSBjb250YWluZXJzWzBdOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJewotCQkJCQkJSUZpbGVbXSBmaWxlcyA9IHJvb3QuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApCi0JCQkJCQl7Ci0JCQkJCQkJcmVzID0gZmlsZXNbMF07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJlcyA9IHJvb3QuZmluZE1lbWJlcihwYXRoKTsKLQkJCX0KLQkJCXJldHVybiByZXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzb3VyY2VWYXJpYWJsZXNCdXR0b25TZWxlY3RlZCgpCi0JewotCQlTdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgU3RyaW5nVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCVN0cmluZyB2YXJpYWJsZVRleHQgPSBkaWFsb2cuZ2V0VmFyaWFibGVFeHByZXNzaW9uKCk7Ci0JCWlmICh2YXJpYWJsZVRleHQgIT0gbnVsbCkKLQkJewotCQkJcmVzb3VyY2VUZXh0Lmluc2VydCh2YXJpYWJsZVRleHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0RGVmYXVsdFJlc291cmNlKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykKLQl7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJLy8gaWYgdmFyaWFibGVzIGFyZSBwcmVzZW50LCB3ZSBjYW5ub3QgcmVzb2x2ZSB0aGUgZGlyZWN0b3J5Ci0JCVN0cmluZyB3b3JraW5nRGlyUGF0aCA9IGdldFRleHQoKTsKLQkJaWYgKHdvcmtpbmdEaXJQYXRoLmluZGV4T2YoIiR7IikgPj0gMCkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlJU3RyaW5nVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJbWFuYWdlci52YWxpZGF0ZVN0cmluZ1ZhcmlhYmxlcyh3b3JraW5nRGlyUGF0aCk7Ci0JCQkJaWYgKG11c3RFeGlzdCkKLQkJCQl7Ci0JCQkJCVN0cmluZyBwYXRoID0gbWFuYWdlci5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKHdvcmtpbmdEaXJQYXRoKTsKLQkJCQkJdmFsaWRhdGVSZXNvdXJjZShwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXNldEVycm9yTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG11c3RFeGlzdCAmJiB3b3JraW5nRGlyUGF0aC5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlKHdvcmtpbmdEaXJQYXRoKTsKLQkJfQotCQllbHNlIGlmIChyZXF1aXJlZCAmJiB3b3JraW5nRGlyUGF0aC5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoZ2V0TWVzc2FnZShFUlJPUl9ESVJFQ1RPUllfTk9UX1NQRUNJRklFRCkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2UoU3RyaW5nIHdvcmtpbmdEaXJQYXRoKQotCXsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCQl7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBnZXRSZXNvdXJjZSgpOwotCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJewotCQkJCUZpbGUgZGlyID0gbmV3IEZpbGUod29ya2luZ0RpclBhdGgpOwotCQkJCWlmIChkaXIuaXNEaXJlY3RvcnkoKSkKLQkJCQl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChyZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLkZJTEUpCi0JCXsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdvcmtpbmdEaXJQYXRoKTsKLQkJCWlmIChmaWxlLmlzRmlsZSgpKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShnZXRNZXNzYWdlKEVSUk9SX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRNZXNzYWdlKGludCB0eXBlKTsKLQotCXByb3RlY3RlZCB2b2lkIHRleHRNb2RpZmllZCgpCi0JewotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dCgpCi0JewotCQlyZXR1cm4gcmVzb3VyY2VUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkKLQl7Ci0JCXJlc291cmNlVGV4dC5zZXRUZXh0KHRleHQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKQotCXsKLQkJZkxhdW5jaENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JfQotCi0JcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uIGdldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCXsKLQkJcmV0dXJuIGZMYXVuY2hDb25maWd1cmF0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMQ29uc29sZUxpbmVUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMQ29uc29sZUxpbmVUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmQ3ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTENvbnNvbGVMaW5lVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBPcmFuZ2V2b2x0ICh3d3cub3Jhbmdldm9sdC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBMYXJzIEdlcnNtYW5uICh3d3cub3Jhbmdldm9sdC5jb20pIAotICogICAgIERvdWcgU2F0Y2h3ZWxsIChodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51aykgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi0vKioKLSAqIDxwPgotICogQSBjb25zb2xlIGxpbmUgdHJhY2tlciBmb3IgWFNMIGxhdW5jaGVzLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIE5vdGU6IEl0IGlzIGFjdHVhbGx5IGNvbmZpZ3VyZWQgdG8gcnVuIGZvciBhbGwgSmF2YSBsYXVuY2hlcyBpbgotICogPGNvZGU+cGx1Z2luLnhtbDwvY29kZT4sIGJ1dCBpdCBvbmx5IHJlYWxseSBiZWNvbWVzIGVuYWJsZWQgd2hlbiB0aGUKLSAqIGxhdW5jaCBjb25maWd1cmF0aW9uIHR5cGUgaXMKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlPC9jb2RlPi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFhTTENvbnNvbGVMaW5lVHJhY2tlciBpbXBsZW1lbnRzIElDb25zb2xlTGluZVRyYWNrZXIKLXsKLQlwcml2YXRlIElDb25zb2xlIGNvbnNvbGU7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQ7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JCWNvbnNvbGUgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUNvbnNvbGUgY29uc29sZSkKLQl7Ci0JCXRoaXMuY29uc29sZSA9IGNvbnNvbGU7Ci0JCXRoaXMuZW5hYmxlZCA9IGZhbHNlOwotCQl0cnkKLQkJewotCQkJU3RyaW5nIGxhdW5jaFR5cGVJZCA9IGNvbnNvbGUuZ2V0UHJvY2VzcygpLmdldExhdW5jaCgpLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKS5nZXRUeXBlKCkuZ2V0SWRlbnRpZmllcigpOwotCQkJdGhpcy5lbmFibGVkID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIi5lcXVhbHMobGF1bmNoVHlwZUlkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxpbmVBcHBlbmRlZChJUmVnaW9uIGxpbmUpCi0JewotCQlpZiAoIWVuYWJsZWQpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxpbmVPZmZzZXQgPSBsaW5lLmdldE9mZnNldCgpOwotCQlpbnQgbGluZUxlbmd0aCA9IGxpbmUuZ2V0TGVuZ3RoKCk7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgdGV4dCA9IGNvbnNvbGUuZ2V0RG9jdW1lbnQoKS5nZXQobGluZU9mZnNldCwgbGluZUxlbmd0aCk7Ci0JCQlpbnQgaTsKLQkJCWlmICgoaSA9IHRleHQuaW5kZXhPZigiZmlsZTovIikpICE9IC0xIHx8IChpID0gdGV4dC5pbmRleE9mKCJodHRwOi8vIikpICE9IC0xIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl8fCAoaSA9IHRleHQuaW5kZXhPZigiaHR0cHM6Ly8iKSkgIT0gLTEgfHwgKGkgPSB0ZXh0LmluZGV4T2YoImZ0cDovLyIpKSAhPSAtMSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl7Ci0JCQkJaW50IHYgPSBpICsgOTsKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHRleHQuc3Vic3RyaW5nKGksIHYpKTsKLQkJCQlmb3IgKDsgdiA8IHRleHQubGVuZ3RoKCk7IHYrKykKLQkJCQl7Ci0JCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KHYpOwotCQkJCQlpZiAoYyAhPSAnICcgJiYgYyAhPSAnOicgJiYgYyAhPSAnOycgJiYgYyAhPSAneycgJiYgYyAhPSAnfScgJiYgYyAhPSAnWycgJiYgYyAhPSAnXScgJiYgYyAhPSAnKCcgJiYgYyAhPSAnKScpCi0JCQkJCXsKLQkJCQkJCXNiLmFwcGVuZChjKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJRXh0ZXJuYWxGaWxlQ29uc29sZUh5cGVyTGluayBsaW5rID0gbmV3IEV4dGVybmFsRmlsZUNvbnNvbGVIeXBlckxpbmsoc2IudG9TdHJpbmcoKSwgLTEpOwotCQkJCWNvbnNvbGUuYWRkTGluayhsaW5rLCBsaW5lT2Zmc2V0ICsgaSwgdiAtIGkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHRlcm5hbEZpbGVDb25zb2xlSHlwZXJMaW5rIGltcGxlbWVudHMgSUh5cGVybGluawotCXsKLQkJcHJpdmF0ZSBmaW5hbCBpbnQgZkxpbmVOdW1iZXI7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHVyaTsKLQotCQlwdWJsaWMgRXh0ZXJuYWxGaWxlQ29uc29sZUh5cGVyTGluayhTdHJpbmcgdXJpLCBpbnQgbGluZU51bWJlcikKLQkJewotCQkJdGhpcy5mTGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JCQl0aGlzLnVyaSA9IHVyaTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUh5cGVybGluayNsaW5rRW50ZXJlZCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZCgpCi0JCXsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUh5cGVybGluayNsaW5rRXhpdGVkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoKQotCQl7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVIeXBlcmxpbmsjbGlua0FjdGl2YXRlZCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKCkKLQkJewotCQkJVVJMIHVybCA9IG51bGw7Ci0JCQl0cnkKLQkJCXsKLQkJCQl1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJU3RyaW5nIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwuZ2V0UGF0aCgpKTsKLQkJCQlQYXRoIGZFeHRlcm5hbFBhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihmRXh0ZXJuYWxQYXRoKTsKLQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkKLQkJCQl7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0JCQkJCXsKLQkJCQkJCUlGaWxlIGN1cnIgPSBmaWxlc1swXTsKLQkJCQkJCUlFZGl0b3JQYXJ0IHBhcnQ7Ci0JCQkJCQl0cnkKLQkJCQkJCXsKLQkJCQkJCQlwYXJ0ID0gSURFLm9wZW5FZGl0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCksIGN1cnIpOwotCQkJCQkJCWlmIChwYXJ0ICE9IG51bGwgJiYgZkxpbmVOdW1iZXIgIT0gLTEpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQl0cnkKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQlyZXZlYWxMaW5lKChJVGV4dEVkaXRvcikgcGFydCwgZkxpbmVOdW1iZXIpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQotCQkJCQkJewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVByb2dyYW0ubGF1bmNoKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZXZlYWxMaW5lKElUZXh0RWRpdG9yIGVkaXRvciwgaW50IGxpbmVOdW1iZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCQl7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCUlSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmVOdW1iZXIgLSAxKTsKLQkJCWVkaXRvci5zZWxlY3RBbmRSZXZlYWwocmVnaW9uLmdldE9mZnNldCgpLCAwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xEZWJ1Z1VJQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMRGVidWdVSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OThhMDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xEZWJ1Z1VJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgdGhlIFhTTCBEZWJ1ZyBVSS4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgWFNMRGVidWdVSUNvbnN0YW50cwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCArICcuJzsKLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIHN0b3JlIGNvbHVtbiBzZXR0aW5nIHByZWZlcmVuY2VzIGZvciB0aGUgPGNvZGU+SW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NPUl9ERVRBSUxTX0RJQUxPRyA9IFBSRUZJWCArICJQUk9DRVNTT1JfREVUQUlMU19ESUFMT0ciOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQ29uc3RhbnQgdXNlZCB0byBzdG9yZSBjb2x1bW4gc2V0dGluZyBwcmVmZXJlbmNlcyBmb3IgdGhlIDxjb2RlPlBhcmFtZXRlcnNCbG9jazwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX1BBUkFNQVRFUlNfQkxPQ0sgPSBQUkVGSVggKyAiTUFJTl9QQVJBTUFURVJTX0JMT0NLIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gc3RvcmUgY29sdW1uIHNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHRoZSA8Y29kZT5UcmFuc2Zvcm1zQmxvY2s8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9UUkFOU0ZPUk1TX0JMT0NLID0gUFJFRklYICsgIk1BSU5fVFJBTlNGT1JNU19CTE9DSyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIHN0b3JlIGNvbHVtbiBzZXR0aW5nIHByZWZlcmVuY2VzIGZvciB0aGUgPGNvZGU+RmVhdHVyZXNCbG9jazwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFU19CTE9DSyA9IFBSRUZJWCArICJGRUFUVVJFU19CTE9DSyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIHN0b3JlIGNvbHVtbiBzZXR0aW5nIHByZWZlcmVuY2VzIGZvciB0aGUgPGNvZGU+T3V0cHV0QmxvY2s8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0JMT0NLID0gUFJFRklYICsgIk9VVFBVVF9CTE9DSyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIHN0b3JlIGNvbHVtbiBzZXR0aW5nIHByZWZlcmVuY2VzIGZvciB0aGUgPGNvZGU+RmVhdHVyZXNCbG9jazwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFU19MQVVOQ0hfQkxPQ0sgPSBQUkVGSVggKyAiRkVBVFVSRVNfTEFVTkNIX0JMT0NLIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBpZCBvZiB0aGUgWFNMIGVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTF9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YU0xFZGl0b3IiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMRGVidWdVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTERlYnVnVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NmQ0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMRGVidWdVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgWFNMIERlYnVnIFVJIHBsdWdpbi4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgWFNMRGVidWdVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQkvKioKLQkgKiBUaGUgaWQgb2YgdGhpcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBYU0xEZWJ1Z1VJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqLwotCXB1YmxpYyBYU0xEZWJ1Z1VJUGx1Z2luKCkKLQl7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNMRGVidWdVSVBsdWdpbiBnZXREZWZhdWx0KCkKLQl7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIEltYWdlRGVzY3JpcHRvciBmcm9tIGEgcGF0aCBpbiB0aGlzIGJ1bmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgaW1hZ2UKLQkgKiBAcmV0dXJuIHRoZSBJbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpCi0JewotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igb3BlbmluZyBhIGdpdmVuIHByZWZlcmVuY2UgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLQkgKiBAcGFyYW0gcGFnZSB0aGUgcHJlZmVyZW5jZSBwYWdlIHRvIHNob3cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2hvd1ByZWZlcmVuY2VQYWdlKFN0cmluZyBpZCwgSVByZWZlcmVuY2VQYWdlIHBhZ2UpCi0JewotCQlmaW5hbCBJUHJlZmVyZW5jZU5vZGUgdGFyZ2V0Tm9kZSA9IG5ldyBQcmVmZXJlbmNlTm9kZShpZCwgcGFnZSk7Ci0KLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcigpOwotCQltYW5hZ2VyLmFkZFRvUm9vdCh0YXJnZXROb2RlKTsKLQkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhYU0xEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIG1hbmFnZXIpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXQotCQl7IGZhbHNlIH07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKFhTTERlYnVnVUlQbHVnaW4uZ2V0U3RhbmRhcmREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpCi0JCQl7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKHRhcmdldE5vZGUuZ2V0TGFiZWxUZXh0KCkpOwotCQkJCXJlc3VsdFswXSA9IChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCBEaXNwbGF5IGlmIHBvc3NpYmxlLCBvciBlbHNlIHRoZSBkZWZhdWx0IERpc3BsYXkuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBvciBkZWZhdWx0IERpc3BsYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkKLQl7Ci0JCURpc3BsYXkgZGlzcGxheTsKLQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93IGZyb20gdGhlIHdvcmtiZW5jaC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCXsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNoZWxsIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3RpdmUgd29ya2JlbmNoIHNoZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpCi0JewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFjdGl2ZSBwYWdlIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3RpdmUgcGFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpCi0JewotCQlJV29ya2JlbmNoV2luZG93IHcgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHcgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIHcuZ2V0QWN0aXZlUGFnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGJ5IGNyZWF0aW5nIGEgbmV3IFN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gZSB0aGUgZXhjZXB0aW9uIHRvIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpCi0JewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBnaXZlbiBjb3JlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZSB0aGUgZXhjZXB0aW9uIHRvIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coQ29yZUV4Y2VwdGlvbiBlKQotCXsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL1hTTExhdW5jaENvbmZpZ3VyYXRpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwNmE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBYU0wgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFicyB3aGljaCBhbGxvd3MgYSBudW1iZXIgb2YgJ2Jsb2NrcycgdG8gYmUgYWRkZWQuCi0gKiBFYWNoIGJsb2NrIG11c3QgaXRzZWxmIGZ1bGx5IGltcGxlbWVudCA8Y29kZT5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjwvY29kZT4uCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTTExhdW5jaENvbmZpZ3VyYXRpb25UYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIKLXsKLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gYmxvY2tzOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmxvY2tzKElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gYmxvY2tzKQotCXsKLQkJdGhpcy5ibG9ja3MgPSBibG9ja3M7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlzZXRDb250cm9sKGNvbXApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCWVsZW1lbnQuc2V0RGVmYXVsdHMoY29uZmlndXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCWVsZW1lbnQuaW5pdGlhbGl6ZUZyb20oY29uZmlndXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCWVsZW1lbnQucGVyZm9ybUFwcGx5KGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nKQotCXsKLQkJc3VwZXIuc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQlmb3IgKElMYXVuY2hDb25maWd1cmF0aW9uVGFiIGVsZW1lbnQgOiBibG9ja3MpCi0JCQllbGVtZW50LnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCWVsZW1lbnQuZGlzcG9zZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFjdGl2YXRlZChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5KQotCXsKLQkJLy8gZG9uJ3QgY2FsbCBpbml0aWFsaXplRnJvbQotCQkvLyBzdXBlci5hY3RpdmF0ZWQod29ya2luZ0NvcHkpOwotCQlmb3IgKElMYXVuY2hDb25maWd1cmF0aW9uVGFiIGVsZW1lbnQgOiBibG9ja3MpCi0JCQllbGVtZW50LmFjdGl2YXRlZCh3b3JraW5nQ29weSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0JCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCXZhbGlkICY9IGVsZW1lbnQuaXNWYWxpZChjb25maWd1cmF0aW9uKTsKLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkKLQl7Ci0JCVN0cmluZyBtID0gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCWlmIChtID09IG51bGwpCi0JCXsKLQkJCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCXsKLQkJCQltID0gZWxlbWVudC5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlpZiAobSAhPSBudWxsKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotCXsKLQkJU3RyaW5nIG0gPSBzdXBlci5nZXRNZXNzYWdlKCk7Ci0JCWlmIChtID09IG51bGwpCi0JCXsKLQkJCWZvciAoSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZWxlbWVudCA6IGJsb2NrcykKLQkJCXsKLQkJCQltID0gZWxlbWVudC5nZXRNZXNzYWdlKCk7Ci0JCQkJaWYgKG0gIT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMTGF1bmNoU2hvcnRjdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xMYXVuY2hTaG9ydGN1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGUyZjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xMYXVuY2hTaG9ydGN1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaFNob3J0Y3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLklucHV0RmlsZUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoUGlwZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFRyYW5zZm9ybTsKLQotLyoqCi0gKiA8dGFibGUgYm9yZGVyPTE+Ci0gKiAJPHRoPgotICogCQk8dHI+Ci0gKiAJCQk8dGQ+WE1MIEZpbGVzPC90ZD4KLSAqICAJCTx0ZD5YU0wgRmlsZXM8L3RkPgkJCQotICogCQkJPHRkPkFjdGlvbjwvdGQ+Ci0gKiAJCTwvdHI+Ci0gKiAgPC90aD4KLSAqICA8dGJvZHk+Ci0gKiAgCTx0cj4KLSAqIAkJCTx0ZD4xPC90ZD4KLSAqIAkJCTx0ZD4wPC90ZD4KLSAqIAkJCTx0ZD5MYXVuY2ggYXNzdW1pbmcgZW1iZWRkZWQgc3R5bGVzaGVldCBpbnN0cnVjdGlvbjwvdGQ+Ci0gKiAgCTwvdHI+Ci0gKiAgCTx0cj4KLSAqIAkJCTx0ZD4wPC90ZD4KLSAqIAkJCTx0ZD4mZ3Q7PTE8L3RkPgotICogCQkJPHRkPk9wZW4gZGlhbG9nIC0gcHJvbXB0IGZvciBpbnB1dCBmaWxlPC90ZD4KLSAqICAJPC90cj4KLSAqICAJPHRyPgotICogCQkJPHRkPjE8L3RkPgotICogCQkJPHRkPiZndDs9MTwvdGQ+Ci0gKiAJCQk8dGQ+TGF1bmNoPC90ZD4KLSAqICAJPC90cj4KLSAqICA8L3Rib2R5PgotICogPC90YWJsZT4KLSAqIAotICogPHA+VGhlIGxhdW5jaCBzaG9ydGN1dCBzaG91bGQgbm90IGFwcGVhciBpbiB0aGUgbWVudSBmb3IgYW55IG90aGVyIGNvbWJpbmF0aW9uIG9mIGZpbGVzPC9wPgotICogPHA+SW4gYWxsIGNhc2VzLCBhIGNoZWNrIG11c3QgYmUgcGVyZm9ybWVkIHRvIGZpbmQgYW55IGV4aXN0aW5nIGxhdW5jaCBjb25maWd1cmF0aW9uIHRoYXQgdXNlcyB0aGUgc2VsZWN0ZWQgZmlsZXMuPC9wPgotICogCi0gKiBAYXV0aG9yIERvdWcKLSAqLwotcHVibGljIGNsYXNzIFhTTExhdW5jaFNob3J0Y3V0IGltcGxlbWVudHMgSUxhdW5jaFNob3J0Y3V0Ci17Ci0JcHJpdmF0ZSBJRmlsZSB4bWxGaWxlOwotCXByaXZhdGUgSVBhdGggeG1sRmlsZVBhdGg7Ci0JcHJpdmF0ZSBJRmlsZVtdIHhzbEZpbGVzOwotCQotCXB1YmxpYyB2b2lkIGxhdW5jaChJU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nIG1vZGUpCi0JewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCXsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJc2VhcmNoQW5kTGF1bmNoKHNzZWwudG9BcnJheSgpLG1vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGF1bmNoKElFZGl0b3JQYXJ0IGVkaXRvciwgU3RyaW5nIG1vZGUpCi0JewotICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCXsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlzZWFyY2hBbmRMYXVuY2gobmV3IE9iamVjdFtdeyBmaWxlIH0sIG1vZGUpOwotCQl9IAotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VhcmNoQW5kTGF1bmNoKE9iamVjdFtdIG9iamVjdHMsIFN0cmluZyBtb2RlKQotCXsKLQkJaWYgKGZpbGxGaWxlcyhvYmplY3RzKSkKLQkJewotCQkJLy8gZW5zdXJlIHdlIGhhdmUgYW4gaW5wdXQgZmlsZQotCQkJaWYgKHhtbEZpbGUgPT0gbnVsbCkKLQkJCQlwcm9tcHRGb3JJbnB1dCgpOwotCQkJaWYgKHhtbEZpbGUgIT0gbnVsbCB8fCB4bWxGaWxlUGF0aCAhPSBudWxsKQotCQkJCWxhdW5jaChtb2RlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9tcHRGb3JJbnB1dCgpCi0JewotCQkvLyBwcm9tcHQgZm9yIGlucHV0IHhtbCBmaWxlCi0JCVN0YXR1c0RpYWxvZyBkaWFsb2cgPSBuZXcgU3RhdHVzRGlhbG9nKGdldFNoZWxsKCkpewotCQkJcHJpdmF0ZSBJbnB1dEZpbGVCbG9jayBpbnB1dEZpbGVCbG9jayA9IG5ldyBJbnB1dEZpbGVCbG9jayhudWxsKTsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JCQl7Ci0JCQkJQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQljb21wLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQkKLQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLFNXVC5OT05FKTsKLQkJCQlsYWJlbC5zZXRGb250KGNvbXAuZ2V0Rm9udCgpKTsKLQkJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJCWdkLmhvcml6b250YWxJbmRlbnQgPSA1OwotCQkJCWdkLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJCQlnZC53aWR0aEhpbnQgPSAzODA7Ci0JCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTExhdW5jaFNob3J0Y3V0LjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlpbnB1dEZpbGVCbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCQkJCXJldHVybiBjb21wOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpCi0JCQl7Ci0JCQkJSVJlc291cmNlIHJlcyA9IGlucHV0RmlsZUJsb2NrLmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCQl4bWxGaWxlUGF0aCA9IG5ldyBQYXRoKGlucHV0RmlsZUJsb2NrLmdldFRleHQoKSk7Ci0JCQkJZWxzZSBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocmVzLmdldEZ1bGxQYXRoKCkpICYmIHJlcy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCXhtbEZpbGUgPSAoSUZpbGUpcmVzOwotCQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQkJfQotCQkJCi0JCX07Ci0JCWRpYWxvZy5zZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKLQkJZGlhbG9nLnNldFN0YXR1c0xpbmVBYm92ZUJ1dHRvbnModHJ1ZSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTExhdW5jaFNob3J0Y3V0LjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmlsbEZpbGVzKE9iamVjdFtdIHNlbGVjdGlvbnMpCi0JewotCQl4bWxGaWxlID0gbnVsbDsKLQkJeG1sRmlsZVBhdGggPSBudWxsOwotCQlMaXN0PElGaWxlPiB4c2xGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCWZvciAoT2JqZWN0IG9iamVjdCA6IHNlbGVjdGlvbnMpCi0JCXsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCXsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKXJlc291cmNlOwotCQkJCWlmIChGaWxlVXRpbC5pc1hNTEZpbGUoZmlsZSkpCi0JCQkJewotCQkJCQlpZiAoRmlsZVV0aWwuaXNYU0xGaWxlKGZpbGUpKQotCQkJCQkJeHNsRmlsZUxpc3QuYWRkKGZpbGUpOwotCQkJCQllbHNlIGlmICh4bWxGaWxlPT1udWxsKQotCQkJCQkJeG1sRmlsZSA9IGZpbGU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsgLy8gbm8gYWN0aW9uIGlmIHdlIGhhdmUgbW9yZSB0aGFuIHRoYW4gMSB4bWwgZmlsZQotCQkJCX0KLQkJCX0KLQkJfQotCQl4c2xGaWxlcyA9IHhzbEZpbGVMaXN0LnRvQXJyYXkobmV3IElGaWxlWzBdKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaChTdHJpbmcgbW9kZSkKLQl7Ci0JCWlmICh4bWxGaWxlIT1udWxsKQotCQkJeG1sRmlsZVBhdGggPSB4bWxGaWxlLmdldExvY2F0aW9uKCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQljb25maWcgPSBmaW5kT3JDcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnIT1udWxsKQotCQkJCURlYnVnVUlUb29scy5sYXVuY2goY29uZmlnLCBtb2RlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpCi0JewotCQlyZXR1cm4gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBnZXRDb25maWd1cmF0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfTEFVTkNIX0NPTkZJR19UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uIGZpbmRPckNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKGdldENvbmZpZ3VyYXRpb25UeXBlKCkpOwotCQlMaXN0PElMYXVuY2hDb25maWd1cmF0aW9uPiBjYW5kaWRhdGVDb25maWdzID0gbmV3IEFycmF5TGlzdDxJTGF1bmNoQ29uZmlndXJhdGlvbj4oY29uZmlncy5sZW5ndGgpOwotCQlmb3IgKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA6IGNvbmZpZ3MpCi0JCXsKLQkJCVN0cmluZyBpbnB1dEZpbGUgPSBjb25maWcuZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAoU3RyaW5nKSBudWxsKTsKLQkJCXRyeQotCQkJewotCQkJCWlucHV0RmlsZSA9IFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihpbnB1dEZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkvLyBqdXN0IGlnbm9yZSB0aGlzIG9uZQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoaW5wdXRGaWxlKTsKLQkJCS8vIHRoZSBzb3VyY2UgeG1sIGZpbGUgbXVzdCBiZSB0aGUgc2FtZQotCQkJaWYgKHBhdGguZXF1YWxzKHhtbEZpbGVQYXRoKSkKLQkJCXsKLQkJCQlMYXVuY2hIZWxwZXIgbGggPSBuZXcgTGF1bmNoSGVscGVyKGNvbmZpZyk7Ci0JCQkJLy8gYWxsIHRoZSBzZWxlY3RlZCBzdHlsZXNoZWV0cyBtdXN0IGJlIGluIHRoZSBwaXBlbGluZQotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmb3IgKElGaWxlIHN0eWxlc2hlZXQgOiB4c2xGaWxlcykKLQkJCQl7Ci0JCQkJCWZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TGF1bmNoVHJhbnNmb3JtPiBpdGVyID0gbGguZ2V0UGlwZWxpbmUoKS5nZXRUcmFuc2Zvcm1EZWZzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCQl7Ci0JCQkJCQlMYXVuY2hUcmFuc2Zvcm0gbHQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChsdC5nZXRMb2NhdGlvbigpLmVxdWFscyhzdHlsZXNoZWV0LmdldExvY2F0aW9uKCkpKQotCQkJCQkJewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChmb3VuZCkKLQkJCQkJY2FuZGlkYXRlQ29uZmlncy5hZGQoY29uZmlnKTsKLQkJCX0KLQkJfQotCi0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCWludCBjYW5kaWRhdGVDb3VudCA9IGNhbmRpZGF0ZUNvbmZpZ3Muc2l6ZSgpOwotCQlpZiAoY2FuZGlkYXRlQ291bnQgPT0gMSkKLQkJCWNvbmZpZyA9IChJTGF1bmNoQ29uZmlndXJhdGlvbiljYW5kaWRhdGVDb25maWdzLmdldCgwKTsKLQkJZWxzZSBpZiAoY2FuZGlkYXRlQ291bnQgPiAxKQotCQkJY29uZmlnID0gY2hvb3NlQ29uZmlndXJhdGlvbihjYW5kaWRhdGVDb25maWdzKTsKLQkJZWxzZQotCQkJY29uZmlnID0gY3JlYXRlQ29uZmlndXJhdGlvbigpOwotCi0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBjaG9vc2VDb25maWd1cmF0aW9uKExpc3Q8SUxhdW5jaENvbmZpZ3VyYXRpb24+IGNvbmZpZ0xpc3QpCi0JewotCQlJRGVidWdNb2RlbFByZXNlbnRhdGlvbiBsYWJlbFByb3ZpZGVyID0gRGVidWdVSVRvb2xzLm5ld0RlYnVnTW9kZWxQcmVzZW50YXRpb24oKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksIGxhYmVsUHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0RWxlbWVudHMoY29uZmlnTGlzdC50b0FycmF5KCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xMYXVuY2hTaG9ydGN1dC4yIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRNZXNzYWdlKCImU2VsZWN0IGV4aXN0aW5nIGNvbmZpZ3VyYXRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLQkJaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0JCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLQkJewotCQkJcmV0dXJuIChJTGF1bmNoQ29uZmlndXJhdGlvbikgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKCkKLQl7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IGdldENvbmZpZ3VyYXRpb25UeXBlKCk7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY29uZmlnVHlwZS5uZXdJbnN0YW5jZShudWxsLCBnZXRMYXVuY2hNYW5hZ2VyKCkuZ2VuZXJhdGVVbmlxdWVMYXVuY2hDb25maWd1cmF0aW9uTmFtZUZyb20oeG1sRmlsZVBhdGgubGFzdFNlZ21lbnQoKSkpOwotCQkJaWYgKHhtbEZpbGUgIT0gbnVsbCkKLQkJCQl3Yy5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0lOUFVUX0ZJTEUsICIke3dvcmtzcGFjZV9sb2M6IiArIHhtbEZpbGUuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkrIn0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllbHNlCi0JCQkJd2Muc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCB4bWxGaWxlUGF0aC50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJd2Muc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfRkVBVFVSRVNfRlJPTV9QUkVGRVJFTkNFUywgdHJ1ZSk7Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX09VVFBVVF9GSUxFLCB0cnVlKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB0cnVlKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SX1dPUktJTkdfRElSLCB0cnVlKTsKLQotCQkJTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmUgPSBuZXcgTGF1bmNoUGlwZWxpbmUoKTsKLQkJCWZvciAoSUZpbGUgZWxlbWVudCA6IHhzbEZpbGVzKQotCQkJewotCQkJCXBpcGVsaW5lLmFkZFRyYW5zZm9ybURlZihuZXcgTGF1bmNoVHJhbnNmb3JtKGVsZW1lbnQuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCksIExhdW5jaFRyYW5zZm9ybS5SRVNPVVJDRV9UWVBFKSk7Ci0JCQl9Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BJUEVMSU5FLCBwaXBlbGluZS50b1hNTCgpKTsKLQkJCWlmICh4bWxGaWxlIT1udWxsKQotCQkJCXdjLnNldE1hcHBlZFJlc291cmNlcyhuZXcgSVJlc291cmNlW117IHhtbEZpbGUuZ2V0UHJvamVjdCgpIH0pOwotCQkJY29uZmlnID0gd2MuZG9TYXZlKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTExhdW5jaFNob3J0Y3V0LjYiKSwgZXhjZXB0aW9uLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCXByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xUVGFiR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9YU0xUVGFiR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhZjA1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvWFNMVFRhYkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQ29tbW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLnNvdXJjZWxvb2t1cC5Tb3VyY2VMb29rdXBUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFDbGFzc3BhdGhUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFKUkVUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uWFNMTWFpblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMub3V0cHV0Lk91dHB1dFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLlhTTFByb2Nlc3NvclRhYjsKLQotLyoqCi0gKlRoZSB0YWIgZ3JvdXAgZm9yIHRoZSBYU0wgdGFicy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgWFNMVFRhYkdyb3VwIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAKLXsKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKi8KLQlwdWJsaWMgWFNMVFRhYkdyb3VwKCkKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2csIFN0cmluZyBtb2RlKQotCXsKLQkJWFNMTWFpblRhYiBtYWluID0gbmV3IFhTTE1haW5UYWIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB0YWJzID0gbmV3IElMYXVuY2hDb25maWd1cmF0aW9uVGFiW10KLQkJeyBtYWluLCBuZXcgWFNMUHJvY2Vzc29yVGFiKCksIG5ldyBPdXRwdXRUYWIobWFpbiksCi0JCS8vIG5ldyBGT0Zvcm1hdHRlclRhYigpLAotCQkJCS8vIG5ldyBYU0xGZWF0dXJlc1RhYigpLAotCQkJCW5ldyBKYXZhSlJFVGFiKCksIG5ldyBKYXZhQ2xhc3NwYXRoVGFiKCksIG5ldyBTb3VyY2VMb29rdXBUYWIoKSwgbmV3IENvbW1vblRhYigpIH07Ci0JCXNldFRhYnModGFicyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWJzdHJhY3RQYXJhbWV0ZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0Fic3RyYWN0UGFyYW1ldGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOWI3NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWJzdHJhY3RQYXJhbWV0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLlBhcmFtZXRlclZpZXdlcjsKLQotLyoqCi0gKiBBIGNvbnZlbmllbnQgYmFzZSBjbGFzcyBmb3IgYWRkL3JlbW92ZSBwYXJhbWV0ZXIgYWN0aW9ucy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYXJhbWV0ZXJBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbgotewotCXByaXZhdGUgUGFyYW1ldGVyVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByb3RlY3RlZCBBYnN0cmFjdFBhcmFtZXRlckFjdGlvbihTdHJpbmcgdGV4dCwgUGFyYW1ldGVyVmlld2VyIHZpZXdlcikKLQl7Ci0JCXN1cGVyKHRleHQpOwotCQlzZXRWaWV3ZXIodmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIHRoZSBwYXJhbWV0ZXJlIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdlcihQYXJhbWV0ZXJWaWV3ZXIgdmlld2VyKQotCXsKLQkJaWYgKHRoaXMudmlld2VyICE9IG51bGwpCi0JCXsKLQkJCXRoaXMudmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQl7Ci0JCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUGFyYW1ldGVyVmlld2VyIGdldFZpZXdlcigpCi0JewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYnV0dG9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBidXR0b24gdGhlIGJ1dHRvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJ1dHRvbihCdXR0b24gYnV0dG9uKQotCXsKLQkJdGhpcy5idXR0b24gPSBidXR0b247Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KQotCQkJewotCQkJCXJ1bigpOwotCQkJfQotCQl9KTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotCXsKLQkJc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWYgKGJ1dHRvbiAhPSBudWxsKQotCQl7Ci0JCQlidXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0JewotCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBTaGVsbCBnZXRTaGVsbCgpCi0JewotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJewotCQkJc2hlbGwgPSBnZXRWaWV3ZXIoKS5nZXRTaGVsbCgpOwotCQl9Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNoZWxsIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBvcGVuaW5nIGEgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgdG8gdXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hlbGwoU2hlbGwgc2hlbGwpCi0JewotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXJldHVybiBnZXRWaWV3ZXIoKS51cGRhdGVTZWxlY3Rpb24oZ2V0QWN0aW9uVHlwZSgpLCBzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0QWN0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLkRFRkFVTFQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzNmI0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLlN0eWxlc2hlZXRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFBpcGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLS8qKgotICogQSBjb252ZW5pZW50IGJhc2UgY2xhc3MgZm9yIGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHlsZXNoZWV0IHZpZXdlci4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBhY3Rpb24gdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gMDsKLQkvKioKLQkgKiBUaGUgYWN0aW9uIHR5cGUgZm9yIGFkZCBhY3Rpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IDE7Ci0JLyoqCi0JICogVGhlIGFjdGlvbiB0eXBlIGZvciByZW1vdmUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAyOwotCS8qKgotCSAqIFRoZSBhY3Rpb24gdHlwZSBmb3IgbW92ZSBhY3Rpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVkUgPSAzOwotCi0JcHJpdmF0ZSBTdHlsZXNoZWV0Vmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByb3RlY3RlZCBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24oU3RyaW5nIHRleHQsIFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyKQotCXsKLQkJc3VwZXIodGV4dCk7Ci0JCXNldFZpZXdlcih2aWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBhcnJheSBvZiBMYXVuY2hUcmFuc2Zvcm0ncyB0byB0aGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSByZXMgbGF1bmNoIHRyYW5zZm9ybXMgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJhbnNmb3JtcyhMYXVuY2hUcmFuc2Zvcm1bXSByZXMpCi0JewotCQl2aWV3ZXIuYWRkVHJhbnNmb3JtcyhyZXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXIoU3R5bGVzaGVldFZpZXdlciB2aWV3ZXIpCi0JewotCQlpZiAodGhpcy52aWV3ZXIgIT0gbnVsbCkKLQkJewotCQkJdGhpcy52aWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQlpZiAodmlld2VyICE9IG51bGwpCi0JCXsKLQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHlsZXNoZWV0Vmlld2VyIGdldFZpZXdlcigpCi0JewotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYnV0dG9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYnV0dG9uIHRoZSBidXR0b24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCdXR0b24oQnV0dG9uIGJ1dHRvbikKLQl7Ci0JCXRoaXMuYnV0dG9uID0gYnV0dG9uOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkKLQkJCXsKLQkJCQlydW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLQl7Ci0JCXN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWlmIChidXR0b24gIT0gbnVsbCkKLQkJewotCQkJYnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotCXsKLQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgZ2V0U2hlbGwoKQotCXsKLQkJaWYgKHNoZWxsID09IG51bGwpCi0JCXsKLQkJCXNoZWxsID0gZ2V0Vmlld2VyKCkuZ2V0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzaGVsbCB0byBiZSB1c2VkIGZvciBvcGVuaW5nIGEgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCB0aGUgc2hlbGwgdG8gdXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hlbGwoU2hlbGwgc2hlbGwpCi0JewotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXJldHVybiBnZXRWaWV3ZXIoKS51cGRhdGVTZWxlY3Rpb24oZ2V0QWN0aW9uVHlwZSgpLCBzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0QWN0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gREVGQVVMVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdDw/PiBnZXRPcmRlcmVkU2VsZWN0aW9uKCkKLQl7Ci0JCUxpc3Q8Pz4gc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCkpLnRvTGlzdCgpOwotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PExhdW5jaFRyYW5zZm9ybT4gZ2V0RW50cmllc0FzTGlzdCgpCi0JewotCQkvLyBJU3R5bGVzaGVldEVudHJ5W10gZW50cmllcyA9IGdldFZpZXdlcigpLmdldEVudHJpZXMoKTsKLQkJLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChlbnRyaWVzLmxlbmd0aCk7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkvLyBsaXN0LmFkZChlbnRyaWVzW2ldKTsKLQkJLy8gfQotCQlMYXVuY2hQaXBlbGluZSBscCA9IChMYXVuY2hQaXBlbGluZSkgZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLQkJcmV0dXJuIGxwLmdldFRyYW5zZm9ybURlZnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbnRyaWVzKExpc3Q8Pz4gbGlzdCkKLQl7Ci0JCWdldFZpZXdlcigpLnNldEVudHJpZXMoKExhdW5jaFRyYW5zZm9ybVtdKSBsaXN0LnRvQXJyYXkobmV3IExhdW5jaFRyYW5zZm9ybVtsaXN0LnNpemUoKV0pKTsKLQkJLy8gLy8gdXBkYXRlIGFsbCBzZWxlY3Rpb24gbGlzdGVuZXJzCi0JCS8vIGdldFZpZXdlcigpLnNldFNlbGVjdGlvbihnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmRleFNlbGVjdGVkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgaW50IGluZGV4KQotCXsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJdGVyYXRvcjw/PiBlbnRyaWVzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCUxpc3Q8Pz4gbGlzdCA9IGdldEVudHJpZXNBc0xpc3QoKTsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKQotCQl7Ci0JCQlPYmplY3QgbmV4dCA9IGVudHJpZXMubmV4dCgpOwotCQkJaWYgKGxpc3QuaW5kZXhPZihuZXh0KSA9PSBpbmRleCkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BY3Rpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWN0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5MzI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BY3Rpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTWVzc2FnZXMgZm9yIHRoZSBkZWJ1ZyBVSSBhY3Rpb25zLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBY3Rpb25NZXNzYWdlcyBleHRlbmRzIE5MUwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWN0aW9uTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIG5hbWUgZm9yIHRoZSByZW1vdmUgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUFjdGlvbl9UZXh0OwotCi0JLyoqCi0JICogQSBuYW1lIGZvciB0aGUgPGNvZGU+QWRkV29ya3NwYWNlRmlsZUFjdGlvbjwvY29kZT4gYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFdvcmtzcGFjZUZpbGVBY3Rpb25fVGV4dDsKLQotCS8qKgotCSAqIEEgbmFtZSBmb3IgdGhlIDxjb2RlPkFkZEV4dGVybmFsRmlsZUFjdGlvbjwvY29kZT4gYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEV4dGVybmFsRmlsZUFjdGlvbl9UZXh0OwotCi0JLyoqCi0JICogQSBuYW1lIGZvciB0aGUgPGNvZGU+TW92ZURvd25BY3Rpb248L2NvZGU+IGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRG93bkFjdGlvbl9UZXh0OwotCi0JLyoqCi0JICogQSBuYW1lIGZvciB0aGUgPGNvZGU+TW92ZVVwQWN0aW9uPC9jb2RlPiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZVVwQWN0aW9uX1RleHQ7Ci0KLQkvKioKLQkgKiBBIGhlYWRpbmcgZm9yIHRoZSA8Y29kZT5BZGRFeHRlcm5hbEZpbGVBY3Rpb248L2NvZGU+IGRpYWxvZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRFeHRlcm5hbEZpbGVBY3Rpb25fU2VsZWN0aW9uXzM7Ci0KLQkvKioKLQkgKiBBIG1lc3NhZ2UgZm9yIHRoZSA8Y29kZT5BZGRXb3Jrc3BhY2VGaWxlQWN0aW9uPC9jb2RlPiBkaWFsb2cuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkV29ya3NwYWNlRmlsZUFjdGlvbl9EaWFsb2dNZXNzYWdlOwotCi0JLyoqCi0JICogQSB0aXRsZSBmb3IgdGhlIDxjb2RlPkFkZFdvcmtzcGFjZUZpbGVBY3Rpb248L2NvZGU+IGRpYWxvZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRXb3Jrc3BhY2VGaWxlQWN0aW9uX0RpYWxvZ1RpdGxlOwotCi0JLyoqCi0JICogQSBuYW1lIGZvciB0aGUgPGNvZGU+QWRkUGFyYW1ldGVyQWN0aW9uPC9jb2RlPiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGFyYW1ldGVyQWN0aW9uOwotCi0JLyoqCi0JICogQSBuYW1lIGZvciB0aGUgPGNvZGU+UmVtb3ZlUGFyYW1ldGVyQWN0aW9uPC9jb2RlPiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlUGFyYW1ldGVyQWN0aW9uOwotCi0JLyoqCi0JICogQSBsYWJlbCBmb3IgdGhlIFZhcmlhYmxlcyBidXR0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFibGVzRmllbGRCdXR0b25fVGV4dDsKLQotCS8qKgotCSAqIEEgdGl0bGUgZm9yIHRoZSA8Y29kZT5BZGRQYXJhbWV0ZXJBY3Rpb248L2NvZGU+IGRpYWxvZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nOwotCi0JLyoqCi0JICogQSBsYWJlbCBmb3IgdGhlIDxjb2RlPkFkZFBhcmFtZXRlckFjdGlvbjwvY29kZT4gbmFtZSB0ZXh0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX05hbWU7Ci0KLQkvKioKLQkgKiBBIGxhYmVsIGZvciB0aGUgPGNvZGU+QWRkUGFyYW1ldGVyQWN0aW9uPC9jb2RlPiB0eXBlIGNvbWJvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfVHlwZTsKLQotCS8qKgotCSAqIEEgbGFiZWwgZm9yIHRoZSA8Y29kZT5BZGRQYXJhbWV0ZXJBY3Rpb248L2NvZGU+IHZhbHVlIHRleHQgYm94LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfVmFsdWU7Ci0KLQlzdGF0aWMKLQl7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEFjdGlvbk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FjdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTFhYWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FjdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1SZW1vdmVBY3Rpb25fVGV4dD1SZW1vdmUKLUFkZFdvcmtzcGFjZUZpbGVBY3Rpb25fVGV4dD1BZGQgRmlsZXMKLUFkZEV4dGVybmFsRmlsZUFjdGlvbl9UZXh0PUFkZCBFeHRlcm5hbCBGaWxlcwotTW92ZURvd25BY3Rpb25fVGV4dD1Nb3ZlIERvd24KLU1vdmVVcEFjdGlvbl9UZXh0PU1vdmUgVXAKLUFkZEV4dGVybmFsRmlsZUFjdGlvbl9TZWxlY3Rpb25fMz0KLUFkZFdvcmtzcGFjZUZpbGVBY3Rpb25fRGlhbG9nTWVzc2FnZT1DaG9vc2UgU3R5bGVzaGVldAotQWRkV29ya3NwYWNlRmlsZUFjdGlvbl9EaWFsb2dUaXRsZT0KLUVkaXRTdHlsZXNoZWV0UGFyYW1ldGVyc0FjdGlvbl9UZXh0PUVkaXQgUGFyYW1ldGVycwotQWRkUGFyYW1ldGVyQWN0aW9uPUFkZCBQYXJhbWV0ZXIKLVJlbW92ZVBhcmFtZXRlckFjdGlvbj1SZW1vdmUgUGFyYW1ldGVyCi1WYXJpYWJsZXNGaWVsZEJ1dHRvbl9UZXh0PVZhcmlhYmxlcy4uLgotQWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZz1BZGQgWFNMVCBQYXJhbWV0ZXIKLUFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfTGFiZWw9QWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZ19MYWJlbAotQWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZ19OYW1lPU5hbWU6Ci1BZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX1R5cGU9VHlwZToKLUFkZFBhcmFtZXRlckFjdGlvbl9EaWFsb2dfVmFsdWU9VmFsdWU6CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BZGRFeHRlcm5hbEZpbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FkZEV4dGVybmFsRmlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUwZDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL0FkZEV4dGVybmFsRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5TdHlsZXNoZWV0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLS8qKgotICogQW4gYWN0aW9uIHRoYXQgb3BlbnMgYSBkaWFsb2cgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZXJuYWxGaWxlQWN0aW9uIGV4dGVuZHMgT3BlbkRpYWxvZ0FjdGlvbgotewotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHN0eWxlc2hlZXQgdmlld2VyCi0JICogQHBhcmFtIGRpYWxvZ1NldHRpbmdzUHJlZml4IGEgcHJlZml4IHRvIHVzZSBmb3Igc2F2aW5nIGRpYWxvZyBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBBZGRFeHRlcm5hbEZpbGVBY3Rpb24oU3R5bGVzaGVldFZpZXdlciB2aWV3ZXIsIFN0cmluZyBkaWFsb2dTZXR0aW5nc1ByZWZpeCkKLQl7Ci0JCXN1cGVyKEFjdGlvbk1lc3NhZ2VzLkFkZEV4dGVybmFsRmlsZUFjdGlvbl9UZXh0LCB2aWV3ZXIsIGRpYWxvZ1NldHRpbmdzUHJlZml4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKQotCXsKLQkJU3RyaW5nIGxhc3RVc2VkUGF0aCA9IGdldERpYWxvZ1NldHRpbmcoTEFTVF9QQVRIX1NFVFRJTkcpOwotCQlpZiAobGFzdFVzZWRQYXRoID09IG51bGwpCi0JCXsKLQkJCWxhc3RVc2VkUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuTVVMVEkpOwotCQlkaWFsb2cuc2V0VGV4dChBY3Rpb25NZXNzYWdlcy5BZGRFeHRlcm5hbEZpbGVBY3Rpb25fU2VsZWN0aW9uXzMpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0VXNlZFBhdGgpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW117ICIqLnhzbCIgfSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlcyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVBhdGggZmlsdGVyUGF0aCA9IG5ldyBQYXRoKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQlMYXVuY2hUcmFuc2Zvcm1bXSBsdHMgPSBuZXcgTGF1bmNoVHJhbnNmb3JtWzFdOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocmVzKS5tYWtlQWJzb2x1dGUoKTsKLQkJbHRzWzBdID0gbmV3IExhdW5jaFRyYW5zZm9ybShwYXRoLnRvUG9ydGFibGVTdHJpbmcoKSwgTGF1bmNoVHJhbnNmb3JtLkVYVEVSTkFMX1RZUEUpOwotCi0JCXNldERpYWxvZ1NldHRpbmcoTEFTVF9QQVRIX1NFVFRJTkcsIGZpbHRlclBhdGgudG9PU1N0cmluZygpKTsKLQotCQlhZGRUcmFuc2Zvcm1zKGx0cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWRkUGFyYW1ldGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BZGRQYXJhbWV0ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhZmU1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BZGRQYXJhbWV0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uUGFyYW1ldGVyVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hBdHRyaWJ1dGU7Ci0KLS8qKgotICogQW4gYWN0aW9uIHRoYXQgb3BlbnMgYSBkaWFsb2cgdG8gYWxsb3cgdGhlIHVzZXIgdG8gYWRkIGEgcGFyYW1ldGVyIHRvIGEgdHJhbnNmb3JtLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRQYXJhbWV0ZXJBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFBhcmFtZXRlckFjdGlvbgotewotCWZpbmFsIFN0cmluZ1tdIHR5cGVzID0gbmV3IFN0cmluZ1tdCi0JeyBMYXVuY2hBdHRyaWJ1dGUuVFlQRV9TVFJJTkcsIExhdW5jaEF0dHJpYnV0ZS5UWVBFX0JPT0xFQU4sIExhdW5jaEF0dHJpYnV0ZS5UWVBFX0lOVCwgTGF1bmNoQXR0cmlidXRlLlRZUEVfRE9VQkxFLCBMYXVuY2hBdHRyaWJ1dGUuVFlQRV9GTE9BVCwgTGF1bmNoQXR0cmlidXRlLlRZUEVfT0JKRUNULAotCQkJTGF1bmNoQXR0cmlidXRlLlRZUEVfQ0xBU1MsIH07Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIHRlaCB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgQWRkUGFyYW1ldGVyQWN0aW9uKFBhcmFtZXRlclZpZXdlciB2aWV3ZXIpCi0JewotCQlzdXBlcihBY3Rpb25NZXNzYWdlcy5BZGRQYXJhbWV0ZXJBY3Rpb24sIHZpZXdlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCU11bHRpcGxlSW5wdXREaWFsb2cgZGlhbG9nID0gbmV3IE11bHRpcGxlSW5wdXREaWFsb2coZ2V0U2hlbGwoKSwgQWN0aW9uTWVzc2FnZXMuQWRkUGFyYW1ldGVyQWN0aW9uX0RpYWxvZyk7Ci0JCVN0cmluZyBuYW1lbGFiZWwgPSBBY3Rpb25NZXNzYWdlcy5BZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX05hbWU7Ci0JCWRpYWxvZy5hZGRUZXh0RmllbGQobmFtZWxhYmVsLCBudWxsLCBmYWxzZSk7Ci0JCVN0cmluZyB0eXBlbGFiZWwgPSBBY3Rpb25NZXNzYWdlcy5BZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX1R5cGU7Ci0JCWRpYWxvZy5hZGRDb21ib0ZpZWxkKHR5cGVsYWJlbCwgMCwgdHlwZXMpOwotCQlTdHJpbmcgdmFyaWFibGVzbGFiZWwgPSBBY3Rpb25NZXNzYWdlcy5BZGRQYXJhbWV0ZXJBY3Rpb25fRGlhbG9nX1ZhbHVlOwotCQlkaWFsb2cuYWRkVmFyaWFibGVzRmllbGQodmFyaWFibGVzbGFiZWwsIG51bGwsIGZhbHNlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spCi0JCXsKLQkJCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFN0cmluZ1ZhbHVlKG5hbWVsYWJlbCk7Ci0JCQlpbnQgdHlwZSA9IGRpYWxvZy5nZXRJbnRWYWx1ZSh0eXBlbGFiZWwpOwotCQkJU3RyaW5nIHZhbHVlID0gZGlhbG9nLmdldFN0cmluZ1ZhbHVlKHZhcmlhYmxlc2xhYmVsKTsKLQkJCUxhdW5jaEF0dHJpYnV0ZSBwYXJhbWV0ZXIgPSBudWxsOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuaW5kZXhPZigiJHsiKSA+IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJcGFyYW1ldGVyID0gbmV3IExhdW5jaEF0dHJpYnV0ZShuYW1lLCB0eXBlc1t0eXBlXSwgdmFsdWUpOwotCQkJZWxzZQotCQkJCXBhcmFtZXRlciA9IG5ldyBMYXVuY2hBdHRyaWJ1dGUobmFtZSwgdHlwZXNbdHlwZV0sIHZhbHVlKTsKLQkJCWdldFZpZXdlcigpLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0JewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BZGRXb3Jrc3BhY2VGaWxlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9BZGRXb3Jrc3BhY2VGaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDg3ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQWRkV29ya3NwYWNlRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5TdHlsZXNoZWV0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLS8qKgotICogQW4gYWN0aW9uIHRoYXQgb3BlbnMgYSBkaWFsb2cgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmlsZSBpbiB0aGUgd29ya3NwYWNlLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRXb3Jrc3BhY2VGaWxlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkKLQl7Ci0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikKLQkJewotCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlpZiAoIShzZWxlY3Rpb25baV0gaW5zdGFuY2VvZiBJRmlsZSkpCi0JCQkJewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBBZGRXb3Jrc3BhY2VGaWxlQWN0aW9uKFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyKQotCXsKLQkJc3VwZXIoQWN0aW9uTWVzc2FnZXMuQWRkV29ya3NwYWNlRmlsZUFjdGlvbl9UZXh0LCB2aWV3ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCi0JCS8vIFZpZXdlckZpbHRlciBmaWx0ZXI9IG5ldyBTdHlsZXNoZWV0RmlsdGVyKGdldFNlbGVjdGVkSmFycygpKTsKLQotCQlJTGFiZWxQcm92aWRlciBscCA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpOwotCi0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLCBscCwgY3ApOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRUaXRsZShBY3Rpb25NZXNzYWdlcy5BZGRXb3Jrc3BhY2VGaWxlQWN0aW9uX0RpYWxvZ1RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoQWN0aW9uTWVzc2FnZXMuQWRkV29ya3NwYWNlRmlsZUFjdGlvbl9EaWFsb2dNZXNzYWdlKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KQotCQkJewotCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSllbGVtZW50OwotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJewotCQkJCQlpZiAoIVhTTENvcmUuaXNYU0xGaWxlKChJRmlsZSlyZXNvdXJjZSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQkJZGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQlkaWFsb2cuc2V0Q29tcGFyYXRvcihuZXcgUmVzb3VyY2VDb21wYXJhdG9yKFJlc291cmNlQ29tcGFyYXRvci5OQU1FKSk7Ci0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCUxhdW5jaFRyYW5zZm9ybVtdIHJlcyA9IG5ldyBMYXVuY2hUcmFuc2Zvcm1bZWxlbWVudHMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKQotCQkJewotCQkJCUlSZXNvdXJjZSBlbGVtID0gKElSZXNvdXJjZSkgZWxlbWVudHNbaV07Ci0JCQkJcmVzW2ldID0gbmV3IExhdW5jaFRyYW5zZm9ybShlbGVtLmdldEZ1bGxQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpLCBMYXVuY2hUcmFuc2Zvcm0uUkVTT1VSQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlhZGRUcmFuc2Zvcm1zKHJlcyk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldEFjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIEFERDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9Db250cm9sQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9Db250cm9sQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2FhZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvQ29udHJvbEFjY2Vzc2libGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVXNlZCB0byBoZWxwIHdpdGggYWNjZXNzaWJpbGl0eS4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEFjY2Vzc2libGVMaXN0ZW5lciBleHRlbmRzIEFjY2Vzc2libGVBZGFwdGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udHJvbE5hbWU7Ci0KLQlwcml2YXRlIENvbnRyb2xBY2Nlc3NpYmxlTGlzdGVuZXIoU3RyaW5nIG5hbWUpCi0JewotCQljb250cm9sTmFtZSA9IG5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkKLQl7Ci0JCWUucmVzdWx0ID0gY29udHJvbE5hbWU7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIGZvciBhZGRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0byB0aGUgZ2l2ZW4gY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCB0aGUgY29udHJvbCB0byBhZGQgdGhpcyB0bwotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIGZvciB0aGlzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZExpc3RlbmVyKENvbnRyb2wgY29tcCwgU3RyaW5nIG5hbWUpCi0JewotCQkvLyBzdHJpcCBtbmVtb25pYwotCQlTdHJpbmdbXSBzdHJzID0gbmFtZS5zcGxpdCgiJiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzdHJpcHBlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IHN0cnMpCi0JCXsKLQkJCXN0cmlwcGVkLmFwcGVuZChlbGVtZW50KTsKLQkJfQotCQljb21wLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IENvbnRyb2xBY2Nlc3NpYmxlTGlzdGVuZXIoc3RyaXBwZWQudG9TdHJpbmcoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9Nb3ZlRG93bkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2MTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uU3R5bGVzaGVldFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi0vKioKLSAqIFRoZSBhY3Rpb24gZm9yIG1vdmluZyBhIHN0eWxlc2hlZXQgZnVydGhlciBkb3duIGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBwaXBlbGluZS4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgTW92ZURvd25BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24KLXsKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIE1vdmVEb3duQWN0aW9uKFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyKQotCXsKLQkJc3VwZXIoQWN0aW9uTWVzc2FnZXMuTW92ZURvd25BY3Rpb25fVGV4dCwgdmlld2VyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKQotCXsKLQkJTGlzdDw/PiB0YXJnZXRzID0gZ2V0T3JkZXJlZFNlbGVjdGlvbigpOwotCQlpZiAodGFyZ2V0cy5pc0VtcHR5KCkpCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCQlMaXN0PExhdW5jaFRyYW5zZm9ybT4gbGlzdCA9IGdldEVudHJpZXNBc0xpc3QoKTsKLQkJaW50IGJvdHRvbSA9IGxpc3Quc2l6ZSgpIC0gMTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IHRhcmdldHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0JCXsKLQkJCU9iamVjdCB0YXJnZXQgPSB0YXJnZXRzLmdldChpKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHRhcmdldCk7Ci0JCQlpZiAoaW5kZXggPCBib3R0b20pCi0JCQl7Ci0JCQkJYm90dG9tID0gaW5kZXggKyAxOwotCQkJCU9iamVjdCB0ZW1wID0gbGlzdC5nZXQoYm90dG9tKTsKLQkJCQlsaXN0LnNldChib3R0b20sIChMYXVuY2hUcmFuc2Zvcm0pdGFyZ2V0KTsKLQkJCQlsaXN0LnNldChpbmRleCwgKExhdW5jaFRyYW5zZm9ybSl0ZW1wKTsKLQkJCX0KLQkJCWJvdHRvbSA9IGluZGV4OwotCQl9Ci0JCXNldEVudHJpZXMobGlzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGdldFZpZXdlcigpLnVwZGF0ZVNlbGVjdGlvbihnZXRBY3Rpb25UeXBlKCksIHNlbGVjdGlvbikgJiYgIWlzSW5kZXhTZWxlY3RlZChzZWxlY3Rpb24sIGdldEVudHJpZXNBc0xpc3QoKS5zaXplKCkgLSAxKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldEFjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIE1PVkU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9Nb3ZlVXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0NTQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9Nb3ZlVXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uU3R5bGVzaGVldFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi0vKioKLSAqIFRoZSBhY3Rpb24gZm9yIG1vdmluZyBhIHN0eWxlc2hlZXQgZnVydGhlciB1cCBpbiB0aGUgdHJhbnNmb3JtYXRpb24gcGlwZWxpbmUuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIE1vdmVVcEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbgotewotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgTW92ZVVwQWN0aW9uKFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyKQotCXsKLQkJc3VwZXIoQWN0aW9uTWVzc2FnZXMuTW92ZVVwQWN0aW9uX1RleHQsIHZpZXdlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCUxpc3Q8Pz4gdGFyZ2V0cyA9IGdldE9yZGVyZWRTZWxlY3Rpb24oKTsKLQkJaWYgKHRhcmdldHMuaXNFbXB0eSgpKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHRvcCA9IDA7Ci0JCWludCBpbmRleCA9IDA7Ci0JCUxpc3Q8TGF1bmNoVHJhbnNmb3JtPiBsaXN0ID0gZ2V0RW50cmllc0FzTGlzdCgpOwotCQlJdGVyYXRvcjw/PiBlbnRyaWVzID0gdGFyZ2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpCi0JCXsKLQkJCU9iamVjdCB0YXJnZXQgPSBlbnRyaWVzLm5leHQoKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHRhcmdldCk7Ci0JCQlpZiAoaW5kZXggPiB0b3ApCi0JCQl7Ci0JCQkJdG9wID0gaW5kZXggLSAxOwotCQkJCU9iamVjdCB0ZW1wID0gbGlzdC5nZXQodG9wKTsKLQkJCQlsaXN0LnNldCh0b3AsIChMYXVuY2hUcmFuc2Zvcm0pdGFyZ2V0KTsKLQkJCQlsaXN0LnNldChpbmRleCwgKExhdW5jaFRyYW5zZm9ybSl0ZW1wKTsKLQkJCX0KLQkJCXRvcCA9IGluZGV4OwotCQl9Ci0JCXNldEVudHJpZXMobGlzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGdldFZpZXdlcigpLnVwZGF0ZVNlbGVjdGlvbihnZXRBY3Rpb25UeXBlKCksIHNlbGVjdGlvbikgJiYgIWlzSW5kZXhTZWxlY3RlZChzZWxlY3Rpb24sIDApOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QWN0aW9uVHlwZSgpCi0JewotCQlyZXR1cm4gTU9WRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9NdWx0aXBsZUlucHV0RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9NdWx0aXBsZUlucHV0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjBlZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvTXVsdGlwbGVJbnB1dERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5TdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci0KLS8qKgotICogQSBkaWFsb2cgd2l0aCBoYW5keSBtZXRob2RzIGZvciBhZGRpbmcgc2ltcGxlIGNvbnRyb2xzIHRvIGl0c2VsZi4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlwbGVJbnB1dERpYWxvZyBleHRlbmRzIERpYWxvZwotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX05BTUUgPSAiRklFTERfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBURVhUID0gMTAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEJST1dTRSA9IDEwMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBWQVJJQUJMRSA9IDEwMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT01CTyA9IDEwMzsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFuZWw7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxGaWVsZFN1bW1hcnk+IGZpZWxkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmllbGRTdW1tYXJ5PigpOwotCXByb3RlY3RlZCBMaXN0PFNjcm9sbGFibGU+IGNvbnRyb2xMaXN0ID0gbmV3IEFycmF5TGlzdDxTY3JvbGxhYmxlPigpOwotCXByb3RlY3RlZCBMaXN0PFZhbGlkYXRvcj4gdmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdG9yPigpOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBNYXA8T2JqZWN0LCBDb21wYXJhYmxlPiB2YWx1ZU1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgQ29tcGFyYWJsZT4oKTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRpdGxlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHNoZWxsIHRoZSBzaGVsbCB0byBvcGVuIHRoZSBkaWFsb2cgb24KLQkgKiBAcGFyYW0gdGl0bGUgdGhlIHRpdGxlIGZvciB0aGUgZGlhbG9nCi0JICovCi0JcHVibGljIE11bHRpcGxlSW5wdXREaWFsb2coZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyB0aXRsZSkKLQl7Ci0JCXN1cGVyKHNoZWxsKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotCXsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlpZiAodGl0bGUgIT0gbnVsbCkKLQkJewotCQkJc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJQ29udHJvbCBiYXIgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJcmV0dXJuIGJhcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvLyAoKEdyaWREYXRhKSBwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gNDAwOwotCQkvLyAoKEdyaWREYXRhKSBwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSA0MDA7Ci0KLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCS8vIGdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlwYW5lbCA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlwYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJZm9yIChJdGVyYXRvcjxGaWVsZFN1bW1hcnk+IGkgPSBmaWVsZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlGaWVsZFN1bW1hcnkgZmllbGQgPSAoRmllbGRTdW1tYXJ5KSBpLm5leHQoKTsKLQkJCXN3aXRjaCAoZmllbGQudHlwZSkKLQkJCXsKLQkJCQljYXNlIFRFWFQ6Ci0JCQkJCWNyZWF0ZVRleHRGaWVsZChmaWVsZC5uYW1lLCBmaWVsZC5pbml0aWFsVmFsdWUsIGZpZWxkLmFsbG93c0VtcHR5KTsKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gY2FzZSBCUk9XU0U6Ci0JCQkJLy8gY3JlYXRlQnJvd3NlRmllbGQoZmllbGQubmFtZSwgZmllbGQuaW5pdGlhbFZhbHVlLAotCQkJCS8vIGZpZWxkLmFsbG93c0VtcHR5KTsKLQkJCQkvLyBicmVhazsKLQkJCQljYXNlIFZBUklBQkxFOgotCQkJCQljcmVhdGVWYXJpYWJsZXNGaWVsZChmaWVsZC5uYW1lLCBmaWVsZC5pbml0aWFsVmFsdWUsIGZpZWxkLmFsbG93c0VtcHR5KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDT01CTzoKLQkJCQkJY3JlYXRlQ29tYm9GaWVsZChmaWVsZC5uYW1lLCBmaWVsZC5pbml0aWFsSW5kZXgsIGZpZWxkLml0ZW1zKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlmaWVsZExpc3QgPSBudWxsOyAvLyBhbGxvdyBpdCB0byBiZSBnYydkCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29udGFpbmVyKTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxhYmVsLCB0ZXh0IGJveCBhbmQgYnV0dG9uIGZvciBicm93c2luZyB0aGUgZm9yIGEgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IHRoZSBsYWJlbAotCSAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIGluaXRpYWwgdmFsdWUKLQkgKiBAcGFyYW0gYWxsb3dzRW1wdHkgdHJ1ZSBpZiB0aGUgdGV4dCBib3ggY2FuIGJlIGVtcHR5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQnJvd3NlRmllbGQoU3RyaW5nIGxhYmVsVGV4dCwgU3RyaW5nIGluaXRpYWxWYWx1ZSwgYm9vbGVhbiBhbGxvd3NFbXB0eSkKLQl7Ci0JCWZpZWxkTGlzdC5hZGQobmV3IEZpZWxkU3VtbWFyeShCUk9XU0UsIGxhYmVsVGV4dCwgaW5pdGlhbFZhbHVlLCBhbGxvd3NFbXB0eSkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxhYmVsIGFuZCBhIHRleHQgYm94LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQgdGhlIGxhYmVsCi0JICogQHBhcmFtIGluaXRpYWxWYWx1ZSB0aGUgaW5pdGlhbCB2YWx1ZQotCSAqIEBwYXJhbSBhbGxvd3NFbXB0eSB0cnVlIGlmIHRoZSB0ZXh0IGJveCBjYW4gYmUgZW1wdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUZXh0RmllbGQoU3RyaW5nIGxhYmVsVGV4dCwgU3RyaW5nIGluaXRpYWxWYWx1ZSwgYm9vbGVhbiBhbGxvd3NFbXB0eSkKLQl7Ci0JCWZpZWxkTGlzdC5hZGQobmV3IEZpZWxkU3VtbWFyeShURVhULCBsYWJlbFRleHQsIGluaXRpYWxWYWx1ZSwgYWxsb3dzRW1wdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBsYWJlbCwgYSB0ZXh0IGJveCBhbmQgYSBidXR0b24gZm9yIHNlbGVjdGluZyB2YXJpYWJsZXMuCi0JICogCi0JICogQHBhcmFtIGxhYmVsVGV4dCB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gaW5pdGlhbFZhbHVlIHRoZSBpbml0aWFsIHZhbHVlCi0JICogQHBhcmFtIGFsbG93c0VtcHR5IHRydWUgaWYgdGhlIHRleHQgYm94IGNhbiBiZSBlbXB0eQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhcmlhYmxlc0ZpZWxkKFN0cmluZyBsYWJlbFRleHQsIFN0cmluZyBpbml0aWFsVmFsdWUsIGJvb2xlYW4gYWxsb3dzRW1wdHkpCi0JewotCQlmaWVsZExpc3QuYWRkKG5ldyBGaWVsZFN1bW1hcnkoVkFSSUFCTEUsIGxhYmVsVGV4dCwgaW5pdGlhbFZhbHVlLCBhbGxvd3NFbXB0eSkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxhYmVsIGFuZCBhIGNvbWJvLgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQgdGhlIGxhYmVsCi0JICogQHBhcmFtIGluaXRpYWxJbmRleCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gaW5kZXgKLQkgKiBAcGFyYW0gaXRlbXMgdGhlIGFycmF5IG9mIGl0ZW1zIGZvciB0aGUgY29tYm8KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb21ib0ZpZWxkKFN0cmluZyBsYWJlbFRleHQsIGludCBpbml0aWFsSW5kZXgsIFN0cmluZ1tdIGl0ZW1zKQotCXsKLQkJZmllbGRMaXN0LmFkZChuZXcgRmllbGRTdW1tYXJ5KENPTUJPLCBsYWJlbFRleHQsIGl0ZW1zLCBpbml0aWFsSW5kZXgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXh0RmllbGQoU3RyaW5nIGxhYmVsVGV4dCwgU3RyaW5nIGluaXRpYWxWYWx1ZSwgYm9vbGVhbiBhbGxvd0VtcHR5KQotCXsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhbmVsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRleHQuc2V0RGF0YShGSUVMRF9OQU1FLCBsYWJlbFRleHQpOwotCi0JCS8vIG1ha2Ugc3VyZSByb3dzIGFyZSB0aGUgc2FtZSBoZWlnaHQgb24gYm90aCBwYW5lbHMuCi0JCWxhYmVsLnNldFNpemUobGFiZWwuZ2V0U2l6ZSgpLngsIHRleHQuZ2V0U2l6ZSgpLnkpOwotCi0JCWlmIChpbml0aWFsVmFsdWUgIT0gbnVsbCkKLQkJewotCQkJdGV4dC5zZXRUZXh0KGluaXRpYWxWYWx1ZSk7Ci0JCX0KLQotCQlpZiAoIWFsbG93RW1wdHkpCi0JCXsKLQkJCXZhbGlkYXRvcnMuYWRkKG5ldyBWYWxpZGF0b3IoKQotCQkJewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkKLQkJCQl7Ci0JCQkJCXJldHVybiAhdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0pOwotCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKQotCQkJewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLQkJCQl7Ci0JCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQljb250cm9sTGlzdC5hZGQodGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFyaWFibGVzRmllbGQoU3RyaW5nIGxhYmVsVGV4dCwgU3RyaW5nIGluaXRpYWxWYWx1ZSwgYm9vbGVhbiBhbGxvd0VtcHR5KQotCXsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYW5lbCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQljb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDIwMDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0ZXh0LnNldERhdGEoRklFTERfTkFNRSwgbGFiZWxUZXh0KTsKLQotCQkvLyBtYWtlIHN1cmUgcm93cyBhcmUgdGhlIHNhbWUgaGVpZ2h0IG9uIGJvdGggcGFuZWxzLgotCQlsYWJlbC5zZXRTaXplKGxhYmVsLmdldFNpemUoKS54LCB0ZXh0LmdldFNpemUoKS55KTsKLQotCQlpZiAoaW5pdGlhbFZhbHVlICE9IG51bGwpCi0JCXsKLQkJCXRleHQuc2V0VGV4dChpbml0aWFsVmFsdWUpOwotCQl9Ci0KLQkJaWYgKCFhbGxvd0VtcHR5KQotCQl7Ci0JCQl2YWxpZGF0b3JzLmFkZChuZXcgVmFsaWRhdG9yKCkKLQkJCXsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpCi0JCQkJewotCQkJCQlyZXR1cm4gIXRleHQuZ2V0VGV4dCgpLmVxdWFscygiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKQotCQkJewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLQkJCQl7Ci0JCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlCdXR0b24gYnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXAsIElEaWFsb2dDb25zdGFudHMuSUdOT1JFX0lELCBBY3Rpb25NZXNzYWdlcy5WYXJpYWJsZXNGaWVsZEJ1dHRvbl9UZXh0LCBmYWxzZSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlTdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgU3RyaW5nVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJaW50IGNvZGUgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChjb2RlID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQkJewotCQkJCQlTdHJpbmcgdmFyaWFibGUgPSBkaWFsb2cuZ2V0VmFyaWFibGVFeHByZXNzaW9uKCk7Ci0JCQkJCWlmICh2YXJpYWJsZSAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQl0ZXh0Lmluc2VydCh2YXJpYWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRyb2xMaXN0LmFkZCh0ZXh0KTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbWJvRmllbGQoU3RyaW5nIGxhYmVsVGV4dCwgaW50IGluaXRpYWxWYWx1ZSwgU3RyaW5nW10gaXRlbXMpCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJZmluYWwgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJLy8gR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkvLyBkYXRhLndpZHRoSGludCA9IDIwMDsKLQkJLy8gY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljb21iby5zZXREYXRhKEZJRUxEX05BTUUsIGxhYmVsVGV4dCk7Ci0KLQkJLy8gbWFrZSBzdXJlIHJvd3MgYXJlIHRoZSBzYW1lIGhlaWdodCBvbiBib3RoIHBhbmVscy4KLQkJbGFiZWwuc2V0U2l6ZShsYWJlbC5nZXRTaXplKCkueCwgY29tYm8uZ2V0U2l6ZSgpLnkpOwotCi0JCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJY29tYm8uc2VsZWN0KGluaXRpYWxWYWx1ZSk7Ci0KLQkJY29udHJvbExpc3QuYWRkKGNvbWJvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKQotCXsKLQkJZm9yIChJdGVyYXRvcjxTY3JvbGxhYmxlPiBpID0gY29udHJvbExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgaS5uZXh0KCk7Ci0JCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpCi0JCQl7Ci0JCQkJdmFsdWVNYXAucHV0KGNvbnRyb2wuZ2V0RGF0YShGSUVMRF9OQU1FKSwgKChUZXh0KSBjb250cm9sKS5nZXRUZXh0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKQotCQkJewotCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBjb250cm9sOwotCQkJCXZhbHVlTWFwLnB1dChjb250cm9sLmdldERhdGEoRklFTERfTkFNRSksIG5ldyBJbnRlZ2VyKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJCX0KLQkJfQotCQljb250cm9sTGlzdCA9IG51bGw7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgb3BlbigpCi0JewotCQlhcHBseURpYWxvZ0ZvbnQocGFuZWwpOwotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIGtleSkKLQl7Ci0JCXJldHVybiB2YWx1ZU1hcC5nZXQoa2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKFN0cmluZyBrZXkpCi0JewotCQlyZXR1cm4gKFN0cmluZykgZ2V0VmFsdWUoa2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEludFZhbHVlKFN0cmluZyBrZXkpCi0JewotCQlyZXR1cm4gKChJbnRlZ2VyKSBnZXRWYWx1ZShrZXkpKS5pbnRWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmllbGRzKCkKLQl7Ci0JCWZvciAoSXRlcmF0b3I8VmFsaWRhdG9yPiBpID0gdmFsaWRhdG9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCVZhbGlkYXRvciB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yKSBpLm5leHQoKTsKLQkJCWlmICghdmFsaWRhdG9yLnZhbGlkYXRlKCkpCi0JCQl7Ci0JCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCArICIuTVVMVElQTEVfSU5QVVRfRElBTE9HIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKQotCXsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKGdldERpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUoKSk7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpCi0JCXsKLQkJCXNlY3Rpb24gPSBzZXR0aW5ncy5hZGROZXdTZWN0aW9uKGdldERpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEZpZWxkU3VtbWFyeQotCXsKLQkJaW50IGluaXRpYWxJbmRleDsKLQkJaW50IHR5cGU7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgaW5pdGlhbFZhbHVlOwotCQlib29sZWFuIGFsbG93c0VtcHR5OwotCQlTdHJpbmdbXSBpdGVtczsKLQotCQlwdWJsaWMgRmllbGRTdW1tYXJ5KGludCB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSwgYm9vbGVhbiBhbGxvd3NFbXB0eSkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluaXRpYWxWYWx1ZSA9IGluaXRpYWxWYWx1ZTsKLQkJCXRoaXMuYWxsb3dzRW1wdHkgPSBhbGxvd3NFbXB0eTsKLQkJfQotCi0JCXB1YmxpYyBGaWVsZFN1bW1hcnkoaW50IHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmdbXSBpdGVtcywgaW50IGluaXRpYWxJbmRleCkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yCi0JewotCQlib29sZWFuIHZhbGlkYXRlKCkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL09wZW5EaWFsb2dBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9hY3Rpb25zL09wZW5EaWFsb2dBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNjliMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9PcGVuRGlhbG9nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uU3R5bGVzaGVldFZpZXdlcjsKLQotLyoqCi0gKiBBbiBhY3Rpb24gdGhhdCBvcGVucyBhIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkRpYWxvZ0FjdGlvbiBleHRlbmRzIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfUEFUSF9TRVRUSU5HID0gIkxBU1RfUEFUSF9TRVRUSU5HIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZQcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGRpYWxvZyB0aXRsZQotCSAqIEBwYXJhbSB2aWV3ZXIgYSB2aWV3ZXIgdGhhdCB0aGlzIGRpYWxvZyBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiBAcGFyYW0gZGlhbG9nU2V0dGluZ3NQcmVmaXggdGhlIHByZWZpeCB0byB1c2UgZm9yIHNhdmluZyBkaWFsb2cgcHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgT3BlbkRpYWxvZ0FjdGlvbihTdHJpbmcgbGFiZWwsIFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyLCBTdHJpbmcgZGlhbG9nU2V0dGluZ3NQcmVmaXgpCi0JewotCQlzdXBlcihsYWJlbCwgdmlld2VyKTsKLQkJZlByZWZpeCA9IGRpYWxvZ1NldHRpbmdzUHJlZml4OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhbG9nU2V0dGluZ3NQcmVmaXgoKQotCXsKLQkJcmV0dXJuIGZQcmVmaXg7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dTZXR0aW5nKFN0cmluZyBzZXR0aW5nTmFtZSkKLQl7Ci0JCXJldHVybiBnZXREaWFsb2dTZXR0aW5ncygpLmdldChnZXREaWFsb2dTZXR0aW5nc1ByZWZpeCgpICsgIi4iICsgc2V0dGluZ05hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGlhbG9nU2V0dGluZyhTdHJpbmcgc2V0dGluZ05hbWUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCWdldERpYWxvZ1NldHRpbmdzKCkucHV0KGdldERpYWxvZ1NldHRpbmdzUHJlZml4KCkgKyAiLiIgKyBzZXR0aW5nTmFtZSwgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpCi0JewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlyZXR1cm4gc2V0dGluZ3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXRBY3Rpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBBREQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvUmVtb3ZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9SZW1vdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyY2NmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9SZW1vdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uU3R5bGVzaGVldFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi0vKioKLSAqIEFuIGFjdGlvbiB0aGF0IHJlbW92ZXMgYSBzZWxlY3Rpb24gZnJvbSBhIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uCi17Ci0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMuCi0JICogCi0JICogQHBhcmFtIHZpZXdlciB0aGUgdmlld2VyIHRoYXQgd2lsbCBoYXZlIGl0cyBzZWxlY3Rpb24gcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBSZW1vdmVBY3Rpb24oU3R5bGVzaGVldFZpZXdlciB2aWV3ZXIpCi0JewotCQlzdXBlcihBY3Rpb25NZXNzYWdlcy5SZW1vdmVBY3Rpb25fVGV4dCwgdmlld2VyKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJZ2V0Vmlld2VyKCkucmVtb3ZlRW50cmllcygoTGF1bmNoVHJhbnNmb3JtW10pIHNlbGVjdGlvbi50b0xpc3QoKS50b0FycmF5KG5ldyBMYXVuY2hUcmFuc2Zvcm1bMF0pKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZ2V0Vmlld2VyKCkudXBkYXRlU2VsZWN0aW9uKGdldEFjdGlvblR5cGUoKSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldEFjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIE1PVkU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL2FjdGlvbnMvUmVtb3ZlUGFyYW1ldGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9SZW1vdmVQYXJhbWV0ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0ZjIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYWN0aW9ucy9SZW1vdmVQYXJhbWV0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uUGFyYW1ldGVyVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hBdHRyaWJ1dGU7Ci0KLS8qKgotICogQW4gYWN0aW9uIHRoYXQgcmVtb3ZlcyBhIHNlbGVjdGlvbiBmcm9tIGEgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVQYXJhbWV0ZXJBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFBhcmFtZXRlckFjdGlvbgotewotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlciB0aGF0IHdpbGwgaGF2ZSBpdHMgc2VsZWN0aW9uIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlUGFyYW1ldGVyQWN0aW9uKFBhcmFtZXRlclZpZXdlciB2aWV3ZXIpCi0JewotCQlzdXBlcihBY3Rpb25NZXNzYWdlcy5SZW1vdmVQYXJhbWV0ZXJBY3Rpb24sIHZpZXdlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbC5zaXplKCkgPiAwKQotCQl7Ci0JCQlMYXVuY2hBdHRyaWJ1dGVbXSBlbnRyaWVzID0gbmV3IExhdW5jaEF0dHJpYnV0ZVtzZWwuc2l6ZSgpXTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHNlbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaSsrKQotCQkJewotCQkJCUxhdW5jaEF0dHJpYnV0ZSBhdHQgPSAoTGF1bmNoQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJCQllbnRyaWVzW2ldID0gYXR0OwotCQkJfQotCQkJZ2V0Vmlld2VyKCkucmVtb3ZlRW50cmllcyhlbnRyaWVzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9icmVha3BvaW50L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYnJlYWtwb2ludC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTI2NDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9icmVha3BvaW50L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmJyZWFrcG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE1lc3NhZ2VzIGZvciB0aGUgZGVidWcgVUkgYnJlYWtwb2ludHMuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYnJlYWtwb2ludC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBFcnJvciBtZXNzYWdlIGZvciBudWxsIGJyZWFrcG9pbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTEJyZWFrcG9pbnRQcm92aWRlcl8wOwotCXN0YXRpYwotCXsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKQotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYnJlYWtwb2ludC9YU0xCcmVha3BvaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9icmVha3BvaW50L1hTTEJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTI3MzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9icmVha3BvaW50L1hTTEJyZWFrcG9pbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYnJlYWtwb2ludDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuWFNMTGluZUJyZWFrcG9pbnQ7Ci0KLS8qKgotICogQW4gU1NFIDxjb2RlPklCcmVha3BvaW50UHJvdmlkZXI8L2NvZGU+IGZvciBYU0wgZmlsZXMuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFhTTEJyZWFrcG9pbnRQcm92aWRlciBpbXBsZW1lbnRzIElCcmVha3BvaW50UHJvdmlkZXIsIElFeGVjdXRhYmxlRXh0ZW5zaW9uCi17Ci0JcHVibGljIElTdGF0dXMgYWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGVkaXRvckxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIHBvc2l0aW9uIHRvIHNldCBicmVha3BvaW50Ci0JCWludCBwb3MgPSBnZXRWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBlZGl0b3JMaW5lTnVtYmVyKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAocG9zID49IDApCi0JCXsKLQkJCUlSZXNvdXJjZSByZXMgPSBnZXRSZXNvdXJjZUZyb21JbnB1dChpbnB1dCk7Ci0JCQlpZiAocmVzICE9IG51bGwpCi0JCQl7Ci0JCQkJYm9vbGVhbiBhZGQgPSB0cnVlOwotCQkJCWlmIChhZGQpCi0JCQkJewotCQkJCQlJQnJlYWtwb2ludCBwb2ludCA9IG5ldyBYU0xMaW5lQnJlYWtwb2ludChyZXMsIGVkaXRvckxpbmVOdW1iZXIsIHBvcywgcG9zKTsKLQkJCQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQkJCXsKLQkJCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLlhTTEJyZWFrcG9pbnRQcm92aWRlcl8wLCBudWxsKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCS8vIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZEJyZWFrcG9pbnQocG9pbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KQotCQkJewotCQkJCXJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJU3RyaW5nIGlkID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQgJiYgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpICE9IG51bGwgJiYgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWlkID0gKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJYXR0cmlidXRlcy5wdXQoU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsLlNFQ09OREFSWV9JRF9LRVksIGlkKTsKLQkJCQlJQnJlYWtwb2ludCBwb2ludCA9IG5ldyBYU0xMaW5lQnJlYWtwb2ludChyZXMsIGVkaXRvckxpbmVOdW1iZXIsIHBvcywgcG9zKTsKLQkJCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLlhTTEJyZWFrcG9pbnRQcm92aWRlcl8wLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0YXR1cyA9PSBudWxsKQotCQl7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFhTTERlYnVnVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCAiSlNQVUlNZXNzYWdlcy5PSyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCkKLQl7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUZyb21JbnB1dChpbnB1dCk7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSW5wdXQoSUVkaXRvcklucHV0IGlucHV0KQotCXsKLQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQl7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0VmFsaWRQb3NpdGlvbihJRG9jdW1lbnQgaWRvYywgaW50IGVkaXRvckxpbmVOdW1iZXIpCi0JewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChpZG9jICE9IG51bGwpCi0JCXsKLQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQkJCXRyeQotCQkJewotCQkJCUlSZWdpb24gbGluZSA9IGlkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGVkaXRvckxpbmVOdW1iZXIgLSAxKTsKLQkJCQlzdGFydE9mZnNldCA9IGxpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQkJZW5kT2Zmc2V0ID0gTWF0aC5tYXgobGluZS5nZXRPZmZzZXQoKSwgbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCi0JCQkJU3RyaW5nIGxpbmVUZXh0ID0gaWRvYy5nZXQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KS50cmltKCk7Ci0KLQkJCQkvLyBibGFuayBsaW5lcyBvciBQSSdzIGNhbm5vdCBoYXZlIGJyZWFrcG9pbnRzCi0JCQkJaWYgKGxpbmVUZXh0LnRyaW0oKS5lcXVhbHMoIiIpIHx8IGxpbmVUZXh0LnN0YXJ0c1dpdGgoIjw/IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXsKLQkJCQkJcmVzdWx0ID0gLTE7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIGdldCBhbGwgcGFydGl0aW9ucyBmb3IgY3VycmVudCBsaW5lCi0JCQkJCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBudWxsOwotCi0JCQkJCXBhcnRpdGlvbnMgPSBpZG9jLmNvbXB1dGVQYXJ0aXRpb25pbmcoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnMubGVuZ3RoOyArK2kpCi0JCQkJCXsKLQkJCQkJCS8vIFN0cmluZyB0eXBlID0gcGFydGl0aW9uc1tpXS5nZXRUeXBlKCk7Ci0JCQkJCQlyZXN1bHQgPSBwYXJ0aXRpb25zW2ldLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvLyBub3QgdXNlZAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMpCi0JewotCQkvLyBub3QgdXNlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9icmVha3BvaW50L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvYnJlYWtwb2ludC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDExNWQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9icmVha3BvaW50L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1YU0xCcmVha3BvaW50UHJvdmlkZXJfMD11bnN1cHBvcnRlZCBpbnB1dCB0eXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE5NjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1SZXNvdXJjZVNlbGVjdGlvbkJsb2NrLjA9RmlsZToKLVhTTExhdW5jaFNob3J0Y3V0LjA9U2VsZWN0IGFuIGlucHV0IGZpbGUgZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbgotWFNMTGF1bmNoU2hvcnRjdXQuMT1JbnB1dCBGaWxlCi1YU0xMYXVuY2hTaG9ydGN1dC4yPVNlbGVjdCBhIExhdW5jaCBDb25maWd1cmF0aW9uCi1YU0xMYXVuY2hTaG9ydGN1dC42PUVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvbW9kZWwvWFNMQnJlYWtwb2ludEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvbW9kZWwvWFNMQnJlYWtwb2ludEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjA5YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL21vZGVsL1hTTEJyZWFrcG9pbnRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQ3JlYXRlcyBhIHRvZ2dsZSBicmVha3BvaW50IGFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFhTTEJyZWFrcG9pbnRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotewotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyROT04tTkxTLTEkCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKQotCXsKLQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQl7Ci0JCQlJVGV4dEVkaXRvciBlZGl0b3JQYXJ0ID0gKElUZXh0RWRpdG9yKSBhZGFwdGFibGVPYmplY3Q7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQl7Ci0JCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhzbCIpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlyZXR1cm4gbmV3IFhTTExpbmVCcmVha3BvaW50QWRhcHRlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLQl7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXQotCQl7IElUb2dnbGVCcmVha3BvaW50c1RhcmdldC5jbGFzcyB9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tb2RlbC9YU0xMaW5lQnJlYWtwb2ludEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tb2RlbC9YU0xMaW5lQnJlYWtwb2ludEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwMDQ1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvbW9kZWwvWFNMTGluZUJyZWFrcG9pbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5JWFNMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTExpbmVCcmVha3BvaW50OwotCi0vKioKLSAqIEFuIDxjb2RlPklUb2dnbGVCcmVha3BvaW50c1RhcmdldDwvY29kZT4gZm9yIFhTTCBicmVha3BvaW50cy4KLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgWFNMTGluZUJyZWFrcG9pbnRBZGFwdGVyIGltcGxlbWVudHMgSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0Ci17Ci0JcHVibGljIHZvaWQgdG9nZ2xlTGluZUJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldEVkaXRvcihwYXJ0KTsKLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWludCBsaW5lTnVtYmVyID0gdGV4dFNlbGVjdGlvbi5nZXRTdGFydExpbmUoKTsKLQkJCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5nZXRCcmVha3BvaW50cyhJWFNMQ29uc3RhbnRzLklEX1hTTF9ERUJVR19NT0RFTCk7Ci0JCQlmb3IgKElCcmVha3BvaW50IGJyZWFrcG9pbnQgOiBicmVha3BvaW50cykKLQkJCXsKLQkJCQlpZiAocmVzb3VyY2UuZXF1YWxzKGJyZWFrcG9pbnQuZ2V0TWFya2VyKCkuZ2V0UmVzb3VyY2UoKSkpCi0JCQkJewotCQkJCQlpZiAoKChJTGluZUJyZWFrcG9pbnQpIGJyZWFrcG9pbnQpLmdldExpbmVOdW1iZXIoKSA9PSAobGluZU51bWJlciArIDEpKQotCQkJCQl7Ci0JCQkJCQkvLyByZW1vdmUKLQkJCQkJCWJyZWFrcG9pbnQuZGVsZXRlKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjcmVhdGUgbGluZSBicmVha3BvaW50IChkb2MgbGluZSBudW1iZXJzIHN0YXJ0IGF0IDApCi0JCQlYU0xMaW5lQnJlYWtwb2ludCBsaW5lQnJlYWtwb2ludCA9IG5ldyBYU0xMaW5lQnJlYWtwb2ludChyZXNvdXJjZSwgbGluZU51bWJlciArIDEsIDEsIDEpOwotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuYWRkQnJlYWtwb2ludChsaW5lQnJlYWtwb2ludCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5Ub2dnbGVMaW5lQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlyZXR1cm4gZ2V0RWRpdG9yKHBhcnQpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIGJlaW5nIHVzZWQgdG8gZWRpdCBhIFhTTCBmaWxlLCBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gcGFydCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcml2YXRlIElUZXh0RWRpdG9yIGdldEVkaXRvcihJV29ya2JlbmNoUGFydCBwYXJ0KQotCXsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJewotCQkJSVRleHRFZGl0b3IgZWRpdG9yUGFydCA9IChJVGV4dEVkaXRvcikgcGFydDsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQl7Ci0JCQkJaWYgKFhTTENvcmUuaXNYU0xGaWxlKChJRmlsZSlyZXNvdXJjZSkpCi0JCQkJewotCQkJCQlyZXR1cm4gZWRpdG9yUGFydDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblRvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRvZ2dsZVdhdGNocG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5Ub2dnbGVXYXRjaHBvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvbW9kZWwvWFNMTW9kZWxQcmVzZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tb2RlbC9YU0xNb2RlbFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRlZDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9tb2RlbC9YU0xNb2RlbFByZXNlbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z01vZGVsUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklWYWx1ZURldGFpbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuWFNMVmFyaWFibGU7Ci0KLS8qKgotICogQW4gPGNvZGU+SURlYnVnTW9kZWxQcmVzZW50YXRpb248L2NvZGU+IGZvciBYU0wgZGVidWdnaW5nLiAKLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgY2xhc3MgWFNMTW9kZWxQcmVzZW50YXRpb24gZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSURlYnVnTW9kZWxQcmVzZW50YXRpb24KLXsKLQlwcml2YXRlIEltYWdlIGxvY2FsSW1nOwotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUsIE9iamVjdCB2YWx1ZSkKLQl7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotCXsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0xWYXJpYWJsZSkKLQkJewotCQkJWFNMVmFyaWFibGUgdmFyID0gKFhTTFZhcmlhYmxlKSBlbGVtZW50OwotCQkJaWYgKHZhci5nZXRTY29wZSgpLmVxdWFscyhYU0xWYXJpYWJsZS5MT0NBTF9TQ09QRSkpCi0JCQl7Ci0JCQkJaWYgKGxvY2FsSW1nID09IG51bGwpCi0JCQkJCWxvY2FsSW1nID0gWFNMRGVidWdVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIi9pY29ucy9sb2NhbHZhcmlhYmxlX29iai5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGxvY2FsSW1nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJaWYgKGxvY2FsSW1nICE9IG51bGwpCi0JCQlsb2NhbEltZy5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21wdXRlRGV0YWlsKElWYWx1ZSB2YWx1ZSwgSVZhbHVlRGV0YWlsTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlTdHJpbmcgZGV0YWlsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5Ci0JCXsKLQkJCWRldGFpbCA9IHZhbHVlLmdldFZhbHVlU3RyaW5nKCk7Ci0JCX0KLQkJY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpCi0JCXsKLQkJfQotCQlsaXN0ZW5lci5kZXRhaWxDb21wdXRlZCh2YWx1ZSwgZGV0YWlsKTsKLQl9Ci0KLQlwdWJsaWMgSUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KE9iamVjdCBlbGVtZW50KQotCXsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkKLQkJewotCQkJcmV0dXJuIG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSBlbGVtZW50KTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElMaW5lQnJlYWtwb2ludCkKLQkJewotCQkJcmV0dXJuIG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSAoKElMaW5lQnJlYWtwb2ludCkgZWxlbWVudCkuZ2V0TWFya2VyKCkuZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFZGl0b3JJZChJRWRpdG9ySW5wdXQgaW5wdXQsIE9iamVjdCBlbGVtZW50KQotCXsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUxpbmVCcmVha3BvaW50KQotCQl7Ci0JCQlyZXR1cm4gWFNMRGVidWdVSUNvbnN0YW50cy5YU0xfRURJVE9SX0lEOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9BZGRQcm9jZXNzb3JEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9BZGRQcm9jZXNzb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyMDI1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvQWRkUHJvY2Vzc29yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuU3RhdHVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5JbnN0YWxsU3RhbmRpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLlByb2Nlc3Nvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklEZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgQWRkUHJvY2Vzc29yRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nCi17Ci0JcHJpdmF0ZSBmaW5hbCBJbnN0YWxsU3RhbmRpbiBzdGFuZGluUHJvY2Vzc29yOwotCXByaXZhdGUgZmluYWwgSVByb2Nlc3NvclR5cGVbXSBwcm9jZXNzb3JUeXBlczsKLQlwcml2YXRlIElQcm9jZXNzb3JUeXBlIHNlbGVjdGVkUHJvY2Vzc29yVHlwZTsKLQlwcml2YXRlIENvbWJvVmlld2VyIHByb2Nlc3NvclR5cGVGaWVsZDsKLQlwcml2YXRlIFByb2Nlc3NvckxpYnJhcnlCbG9jayBmTGlicmFyeUJsb2NrOwotCXByaXZhdGUgVGV4dCBwcm9jZXNzb3JOYW1lRmllbGQ7Ci0JcHJpdmF0ZSBmaW5hbCBJU3RhdHVzW10gZlN0YXRpOwotCXByaXZhdGUgaW50IGZQcmV2SW5kZXggPSAtMTsKLQlwcml2YXRlIGZpbmFsIEluc3RhbGxlZFByb2Nlc3NvcnNCbG9jayBibG9jazsKLQlwcml2YXRlIGJvb2xlYW4gYWRkaW5nOwotCi0JcHVibGljIEFkZFByb2Nlc3NvckRpYWxvZyhJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2sgYmxvY2ssIFNoZWxsIHBhcmVudCwgSVByb2Nlc3NvclR5cGVbXSB0eXBlcywgSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCkKLQl7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuYmxvY2sgPSBibG9jazsKLQkJZlN0YXRpID0gbmV3IElTdGF0dXNbNV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlN0YXRpLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlmU3RhdGlbaV0gPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXByb2Nlc3NvclR5cGVzID0gdHlwZXM7Ci0JCXNlbGVjdGVkUHJvY2Vzc29yVHlwZSA9IGluc3RhbGwgIT0gbnVsbCA/IGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpIDogdHlwZXNbMF07Ci0JCUluc3RhbGxTdGFuZGluIHN0YW5kaW4gPSBudWxsOwotCQlpZiAoaW5zdGFsbCA9PSBudWxsKQotCQl7Ci0JCQlhZGRpbmcgPSB0cnVlOwotCQkJc3RhbmRpbiA9IG5ldyBJbnN0YWxsU3RhbmRpbihYU0xUUnVudGltZS5jcmVhdGVVbmlxdWVQcm9jZXNzb3JJZChzZWxlY3RlZFByb2Nlc3NvclR5cGUpLCAiIiwgc2VsZWN0ZWRQcm9jZXNzb3JUeXBlLmdldElkKCksIG51bGwsIG5ldyBJUHJvY2Vzc29ySmFyWzBdKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3RhbmRpbiA9IG5ldyBJbnN0YWxsU3RhbmRpbihpbnN0YWxsKTsKLQkJfQotCQlzdGFuZGluUHJvY2Vzc29yID0gc3RhbmRpbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkKLQl7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwLi4uCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nRmllbGRzKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlHcmlkRGF0YSBnZDsKLQkJTGFiZWwgbGFiZWw7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX3Byb2Nlc3Nvck5hbWUpOwotCQlwcm9jZXNzb3JOYW1lRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTk9ORSwgU1dULk5PTkUsIGZhbHNlLCBmYWxzZSk7Ci0JCWdkLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHJvY2Vzc29yTmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLkFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JUeXBlKTsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXByb2Nlc3NvclR5cGVGaWVsZC5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkKLQkJewotCi0JCQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIChJUHJvY2Vzc29yVHlwZVtdKSBpbnB1dDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJCXsKLQkJCQlpbnB1dCA9IG5ld0lucHV0OwotCQkJfQotCQl9KTsKLQkJcHJvY2Vzc29yVHlwZUZpZWxkLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gKChJUHJvY2Vzc29yVHlwZSkgZWxlbWVudCkuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZExpc3RlbmVycygpCi0JewotCQlwcm9jZXNzb3JUeXBlRmllbGQuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJdXBkYXRlUHJvY2Vzc29yVHlwZSgpOwotCQkJfQotCQl9KTsKLQotCQlwcm9jZXNzb3JOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCQkJewotCQkJCXNldFByb2Nlc3Nvck5hbWVTdGF0dXModmFsaWRhdGVQcm9jZXNzb3JOYW1lKCkpOwotCQkJCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkKLQl7Ci0JCXJldHVybiBwcm9jZXNzb3JOYW1lRmllbGQuZ2V0VGV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGFuY2VzdG9yKQotCXsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoYW5jZXN0b3IpOwotCQkoKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDM7Ci0vLwkJKChHcmlkRGF0YSkgcGFyZW50LmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IDQwMDsKLS8vCQkoKEdyaWREYXRhKSBwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSA0MDA7Ci0KLQkJY3JlYXRlRGlhbG9nRmllbGRzKHBhcmVudCk7Ci0KLQkJTGFiZWwgbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbC5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLkFkZFByb2Nlc3NvckRpYWxvZ19qYXJzKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZMaWJyYXJ5QmxvY2sgPSBuZXcgUHJvY2Vzc29yTGlicmFyeUJsb2NrKHRoaXMpOwotCQlDb250cm9sIGJsb2NrID0gZkxpYnJhcnlCbG9jay5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJYmxvY2suc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJaW5pdGlhbGl6ZUZpZWxkcygpOwotCQljcmVhdGVGaWVsZExpc3RlbmVycygpOwotCQlhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2Nlc3NvclR5cGUoKQotCXsKLQkJaW50IHNlbEluZGV4ID0gcHJvY2Vzc29yVHlwZUZpZWxkLmdldENvbWJvKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKHNlbEluZGV4ID09IGZQcmV2SW5kZXgpCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCQlmUHJldkluZGV4ID0gc2VsSW5kZXg7Ci0JCWlmIChzZWxJbmRleCA+PSAwICYmIHNlbEluZGV4IDwgcHJvY2Vzc29yVHlwZXMubGVuZ3RoKQotCQl7Ci0JCQlzZWxlY3RlZFByb2Nlc3NvclR5cGUgPSBwcm9jZXNzb3JUeXBlc1tzZWxJbmRleF07Ci0JCX0KLQkJZkxpYnJhcnlCbG9jay5pbml0aWFsaXplRnJvbShzdGFuZGluUHJvY2Vzc29yLCBzZWxlY3RlZFByb2Nlc3NvclR5cGUpOwotCQl1cGRhdGVTdGF0dXNMaW5lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkKLQl7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQlwcm9jZXNzb3JOYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpCi0JewotCQlwcm9jZXNzb3JUeXBlRmllbGQuc2V0SW5wdXQocHJvY2Vzc29yVHlwZXMpOwotCQlpZiAoYWRkaW5nKQotCQl7Ci0JCQlwcm9jZXNzb3JOYW1lRmllbGQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NvclR5cGVGaWVsZC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJvY2Vzc29yVHlwZXNbMF0pKTsKLQkJCWZMaWJyYXJ5QmxvY2suaW5pdGlhbGl6ZUZyb20oc3RhbmRpblByb2Nlc3Nvciwgc2VsZWN0ZWRQcm9jZXNzb3JUeXBlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByb2Nlc3NvclR5cGVGaWVsZC5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcHJvY2Vzc29yVHlwZUZpZWxkLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzdGFuZGluUHJvY2Vzc29yLmdldFByb2Nlc3NvclR5cGUoKSkpOwotCQkJcHJvY2Vzc29yTmFtZUZpZWxkLnNldFRleHQoc3RhbmRpblByb2Nlc3Nvci5nZXROYW1lKCkpOwotCi0JCQlmTGlicmFyeUJsb2NrLmluaXRpYWxpemVGcm9tKHN0YW5kaW5Qcm9jZXNzb3IsIHNlbGVjdGVkUHJvY2Vzc29yVHlwZSk7Ci0JCX0KLQkJc2V0UHJvY2Vzc29yTmFtZVN0YXR1cyh2YWxpZGF0ZVByb2Nlc3Nvck5hbWUoKSk7Ci0JCXVwZGF0ZVN0YXR1c0xpbmUoKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcm9jZXNzb3JOYW1lKCkKLQl7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzb3JOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgUHJvY2Vzc29yTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX2VudGVyTmFtZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoYmxvY2suaXNEdXBsaWNhdGVOYW1lKG5hbWUpICYmIChzdGFuZGluUHJvY2Vzc29yID09IG51bGwgfHwgIW5hbWUuZXF1YWxzKHN0YW5kaW5Qcm9jZXNzb3IuZ2V0TmFtZSgpKSkpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgUHJvY2Vzc29yTWVzc2FnZXMuQWRkUHJvY2Vzc29yRGlhbG9nX2R1cGxpY2F0ZU5hbWUsIG51bGwpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIElTdGF0dXMgcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUobmFtZSwKLQkJCQkvLyBJUmVzb3VyY2UuRklMRSk7Ci0JCQkJLy8gaWYgKCFzLmlzT0soKSkKLQkJCQkvLyB7Ci0JCQkJLy8gc3RhdHVzLnNldEVycm9yKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFByb2Nlc3Nvck1lc3NhZ2VzLkFkZFByb2Nlc3NvckRpYWxvZ19Qcm9jZXNzb3JfbmFtZV9tdXN0X2JlX2FfdmFsaWRfZmlsZV9uYW1lLAotCQkJCS8vIG5ldyBTdHJpbmdbXQotCQkJCS8vIHsgcy5nZXRNZXNzYWdlKCkgfSkpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlVmVyc2lvblN0YXR1cygpCi0JewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzTGluZSgpCi0JewotCQlJU3RhdHVzIG1heCA9IG51bGw7Ci0JCWZvciAoSVN0YXR1cyBjdXJyIDogZlN0YXRpKQotCQl7Ci0JCQlpZiAoY3Vyci5tYXRjaGVzKElTdGF0dXMuRVJST1IpKQotCQkJewotCQkJCXVwZGF0ZVN0YXR1cyhjdXJyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobWF4ID09IG51bGwgfHwgY3Vyci5nZXRTZXZlcml0eSgpID4gbWF4LmdldFNldmVyaXR5KCkpCi0JCQl7Ci0JCQkJbWF4ID0gY3VycjsKLQkJCX0KLQkJfQotCQl1cGRhdGVTdGF0dXMobWF4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKQotCXsKLQkJZG9Pa1ByZXNzZWQoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvT2tQcmVzc2VkKCkKLQl7Ci0JCWlmIChhZGRpbmcpCi0JCXsKLQkJCXNldEZpZWxkVmFsdWVzVG9Qcm9jZXNzb3Ioc3RhbmRpblByb2Nlc3Nvcik7Ci0JCQlibG9jay5wcm9jZXNzb3JBZGRlZChzdGFuZGluUHJvY2Vzc29yKTsKLQkJfQotLy8JCWVsc2UKLS8vCQkJc2V0RmllbGRWYWx1ZXNUb1Byb2Nlc3NvcigoUHJvY2Vzc29ySW5zdGFsbCllZGl0ZWRQcm9jZXNzb3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZpZWxkVmFsdWVzVG9Qcm9jZXNzb3IoSW5zdGFsbFN0YW5kaW4gcHJvY2Vzc29yKQotCXsKLQkJcHJvY2Vzc29yLnNldE5hbWUocHJvY2Vzc29yTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCXByb2Nlc3Nvci5zZXRQcm9jZXNzb3JUeXBlSWQoc2VsZWN0ZWRQcm9jZXNzb3JUeXBlLmdldElkKCkpOwotCi0JCUlEZWJ1Z2dlcltdIGRlYnVnZ2VycyA9IFhTTFRSdW50aW1lLmdldERlYnVnZ2VycygpOwotCQlmb3IgKElEZWJ1Z2dlciBlbGVtZW50IDogZGVidWdnZXJzKQotCQl7Ci0JCQlpZiAoZWxlbWVudC5nZXRQcm9jZXNzb3JUeXBlKCkuZXF1YWxzKHNlbGVjdGVkUHJvY2Vzc29yVHlwZSkpCi0JCQkJcHJvY2Vzc29yLnNldERlYnVnZ2VySWQoZWxlbWVudC5nZXRJZCgpKTsKLQkJfQotCi0JCWZMaWJyYXJ5QmxvY2sucGVyZm9ybUFwcGx5KHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgZ2V0QWJzb2x1dGVGaWxlT3JFbXB0eShTdHJpbmcgcGF0aCkKLQl7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldEFic29sdXRlRmlsZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQcm9jZXNzb3JOYW1lU3RhdHVzKElTdGF0dXMgc3RhdHVzKQotCXsKLQkJZlN0YXRpWzBdID0gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGdldFN5c3RlbUxpYnJhcnlTdGF0dXMoKQotCXsKLQkJcmV0dXJuIGZTdGF0aVszXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTeXN0ZW1MaWJyYXJ5U3RhdHVzKElTdGF0dXMgc3RhdHVzKQotCXsKLQkJZlN0YXRpWzNdID0gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZlcnNpb25TdGF0dXMoSVN0YXR1cyBzdGF0dXMpCi0JewotCQlmU3RhdGlbMl0gPSBzdGF0dXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uc0VuYWJsZVN0YXRlKElTdGF0dXMgc3RhdHVzKQotCXsKLQkJQnV0dG9uIG9rID0gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCQlpZiAob2sgIT0gbnVsbCAmJiAhb2suaXNEaXNwb3NlZCgpKQotCQkJb2suc2V0RW5hYmxlZChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRCdXR0b25MYXlvdXREYXRhKEJ1dHRvbiBidXR0b24pCi0JewotCQlzdXBlci5zZXRCdXR0b25MYXlvdXREYXRhKGJ1dHRvbik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKCkKLQl7Ci0JCXJldHVybiAiQUREX1BST0NFU1NPUl9ESUFMT0dfU0VDVElPTiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkKLQl7Ci0vLwkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLS8vCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHNldHRpbmdzLmdldFNlY3Rpb24oZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpKTsKLS8vCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotLy8JCXsKLS8vCQkJc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oZ2V0RGlhbG9nU2V0dGluZ3NTZWN0aW9uTmFtZSgpKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHNlY3Rpb247Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9CYXNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9CYXNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3ZTI5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvQmFzZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIEJhc2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0JewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9GZWF0dXJlc0Jsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvRmVhdHVyZXNCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzFkY2RiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9GZWF0dXJlc0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuQWJzdHJhY3RUYWJsZUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSUZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlc0Jsb2NrIGV4dGVuZHMgQWJzdHJhY3RUYWJsZUJsb2NrCi17Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRWaWV3ZXI7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXM7Ci0JcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uVGV4dDsKLQlwcml2YXRlIERpYWxvZ1BhZ2UgZGlhbG9nUGFnZTsKLQotCXB1YmxpYyBGZWF0dXJlc0Jsb2NrKERpYWxvZ1BhZ2UgZGlhbG9nUGFnZSkKLQl7Ci0JCXRoaXMuZGlhbG9nUGFnZSA9IGRpYWxvZ1BhZ2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSUNvbnN0YW50cy5GRUFUVVJFU19CTE9DSzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0VGFibGUoKQotCXsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2Qud2lkdGhIaW50ID0gNDUwOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGMxID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMxLnNldFdpZHRoKDE1MCk7Ci0JCWMxLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJYzEuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suMCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYmxlQ29sdW1uIGMyID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMyLnNldFdpZHRoKDEwMCk7Ci0JCWMyLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJYzIuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suMSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYmxlQ29sdW1uIGMzID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMzLnNldFdpZHRoKDIwMCk7Ci0JCWMzLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJYzMuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suMiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKQotCQl7Ci0KLQkJCXByaXZhdGUgSUZlYXR1cmVbXSBmZWF0dXJlczsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIGZlYXR1cmVzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotCQkJewotCQkJCWZlYXR1cmVzID0gKElGZWF0dXJlW10pIG5ld0lucHV0OwotCQkJfQotCQl9KTsKLQkJdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkKLQkJewotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCQl7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZWxlbWVudDsKLQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KQotCQkJCXsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIHJlbW92ZVVSSShmZWF0dXJlLmdldFVSSSgpKTsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0VHlwZSgpOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBmZWF0dXJlVmFsdWVzLmdldChmZWF0dXJlLmdldFVSSSgpKTsKLQkJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gIiEhIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlwcml2YXRlIFN0cmluZyByZW1vdmVVUkkoU3RyaW5nIHVyaSkKLQkJCXsKLQkJCQlpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQlyZXR1cm4gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCXJldHVybiB1cmk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10KLQkJeyBNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suNSIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suNiIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suNyIpIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlmaW5hbCBTdHJpbmdbXSB2YWxpZCA9IG5ldyBTdHJpbmdbXXtudWxsfTsKLQkJdFZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IElDZWxsTW9kaWZpZXIoKQotCQl7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJGZWF0dXJlc0Jsb2NrLjgiKS5lcXVhbHMocHJvcGVydHkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBlbGVtZW50OwotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGZlYXR1cmVWYWx1ZXMuZ2V0KGZlYXR1cmUuZ2V0VVJJKCkpOwotCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotCQkJewotCQkJCUl0ZW0gaXRlbSA9IChJdGVtKSBlbGVtZW50OwotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGl0ZW0uZ2V0RGF0YSgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8ICIiLmVxdWFscyh2YWx1ZSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJZmVhdHVyZVZhbHVlcy5yZW1vdmUoZmVhdHVyZS5nZXRVUkkoKSk7Ci0JCQkJZWxzZQotCQkJCQlmZWF0dXJlVmFsdWVzLnB1dChmZWF0dXJlLmdldFVSSSgpLCAoU3RyaW5nKXZhbHVlKTsJCQkJCi0JCQkJc2V0RXJyb3JNZXNzYWdlKHZhbGlkWzBdKTsKLQkJCQl0Vmlld2VyLnVwZGF0ZShmZWF0dXJlLCBudWxsKTsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikKLQkJCXsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlMSA9IChJRmVhdHVyZSkgZTE7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZTIgPSAoSUZlYXR1cmUpIGUyOwotCQkJCXJldHVybiBmZWF0dXJlMS5nZXRVUkkoKS5jb21wYXJlVG8oZmVhdHVyZTIuZ2V0VVJJKCkpOwotCQkJfQotCQl9KTsKLQotCQlUZXh0Q2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCQllZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpCi0JCXsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCB2YWx1ZSkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCUlTdGF0dXMgdmFsaWRTdGF0dXMgPSBmZWF0dXJlLnZhbGlkYXRlVmFsdWUoKFN0cmluZykgdmFsdWUpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8ICIiLmVxdWFscyh2YWx1ZSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsaWRbMF0gPSBudWxsOwotCQkJCWVsc2UgaWYgKHZhbGlkU3RhdHVzICE9IG51bGwgJiYgdmFsaWRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQl2YWxpZFswXSA9IHZhbGlkU3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQllbHNlCi0JCQkJCXZhbGlkWzBdID0gbnVsbDsKLQkJCQlyZXR1cm4gdmFsaWRbMF07Ci0JCQl9Ci0JCX0pOwotCi0JCUNlbGxFZGl0b3JbXSBlZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbXQotCQl7IG51bGwsIG51bGwsIGVkaXRvciB9OwotCQl0Vmlld2VyLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotCQl0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKQotCQkJCQl0ZXh0ID0gKChJRmVhdHVyZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KHRleHQgPT0gbnVsbCA/ICIiIDogdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0KLQkJcmVzdG9yZUNvbHVtblNldHRpbmdzKCk7Ci0KLQkJZGVzY3JpcHRpb25UZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuV1JBUCB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZIHwgU1dULlZfU0NST0xMKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDgwOwotCQlkZXNjcmlwdGlvblRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUZlYXR1cmVbXSBpbnB1dCkKLQl7Ci0JCXRWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZlYXR1cmVWYWx1ZXMoTWFwPFN0cmluZywgU3RyaW5nPiBtYXApCi0JewotCQl0aGlzLmZlYXR1cmVWYWx1ZXMgPSBtYXA7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKQotCXsKLQkJZGlhbG9nUGFnZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9GZWF0dXJlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvRmVhdHVyZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjgxYzhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9GZWF0dXJlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLQotcHVibGljIGNsYXNzIEZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotewotCXByaXZhdGUgZmluYWwgTWFwPElQcm9jZXNzb3JUeXBlLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiB0eXBlRmVhdHVyZU1hcCA9IG5ldyBIYXNoTWFwPElQcm9jZXNzb3JUeXBlLCBNYXA8U3RyaW5nLCBTdHJpbmc+PigpOwotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY1ZpZXdlcjsKLQlwcml2YXRlIEZlYXR1cmVzQmxvY2sgZmVhdHVyZXNCbG9jazsKLQotCXB1YmxpYyBGZWF0dXJlc1ByZWZlcmVuY2VQYWdlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JCS8vIG9ubHkgdXNlZCB3aGVuIHBhZ2UgaXMgc2hvd24gcHJvZ3JhbWF0aWNhbGx5Ci0JCXNldFRpdGxlKE1lc3NhZ2VzLmdldFN0cmluZygiRmVhdHVyZXNQcmVmZXJlbmNlUGFnZS4wIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiRmVhdHVyZXNQcmVmZXJlbmNlUGFnZS4xIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5OT05FLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRmVhdHVyZXNQcmVmZXJlbmNlUGFnZS4yIikpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5TSU5HTEUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTk9ORSwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJY1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0JCWNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQotCQkJcHJpdmF0ZSBJUHJvY2Vzc29yVHlwZVtdIHR5cGVzOwotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gdHlwZXM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQkJdHlwZXMgPSAoSVByb2Nlc3NvclR5cGVbXSkgbmV3SW5wdXQ7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlJUHJvY2Vzc29yVHlwZSB0eXBlID0gKElQcm9jZXNzb3JUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiB0eXBlLmdldExhYmVsKCk7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJSVByb2Nlc3NvclR5cGUgdHlwZTEgPSAoSVByb2Nlc3NvclR5cGUpIGUxOwotCQkJCUlQcm9jZXNzb3JUeXBlIHR5cGUyID0gKElQcm9jZXNzb3JUeXBlKSBlMjsKLQkJCQlyZXR1cm4gdHlwZTEuZ2V0TGFiZWwoKS5jb21wYXJlVG8odHlwZTIuZ2V0TGFiZWwoKSk7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSVByb2Nlc3NvclR5cGUgdHlwZSA9IChJUHJvY2Vzc29yVHlwZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJewotCQkJCQlmZWF0dXJlc0Jsb2NrLnNldEZlYXR1cmVWYWx1ZXMoKE1hcDxTdHJpbmcsIFN0cmluZz4pIHR5cGVGZWF0dXJlTWFwLmdldCh0eXBlKSk7Ci0JCQkJCWZlYXR1cmVzQmxvY2suc2V0SW5wdXQodHlwZS5nZXRGZWF0dXJlcygpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZmVhdHVyZXNCbG9jay5zZXRGZWF0dXJlVmFsdWVzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQkJCQkJZmVhdHVyZXNCbG9jay5zZXRJbnB1dChuZXcgSUZlYXR1cmVbMF0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWNWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKQotCQl7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlJUHJvY2Vzc29yVHlwZSB0eXBlID0gKElQcm9jZXNzb3JUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiAhdHlwZS5lcXVhbHMoWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZShYU0xUUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCkpOwotCQkJfQotCi0JCX0pOwotCi0JCWZlYXR1cmVzQmxvY2sgPSBuZXcgRmVhdHVyZXNCbG9jayh0aGlzKTsKLQkJZmVhdHVyZXNCbG9jay5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0KLQkJc2V0SW5wdXQoKTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbnB1dCgpCi0JewotCQlJUHJvY2Vzc29yVHlwZVtdIHR5cGVzID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogdHlwZXMpCi0JCXsKLQkJCXR5cGVGZWF0dXJlTWFwLnB1dCh0eXBlLCB0eXBlLmdldEZlYXR1cmVWYWx1ZXMoKSk7Ci0JCX0KLQkJY1ZpZXdlci5zZXRJbnB1dChYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpKTsKLQkJY1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0SW5pdGlhbFR5cGUoKSksIHRydWUpOwotCX0KLQkKLQlzdGF0aWMgSVByb2Nlc3NvclR5cGUgZ2V0SW5pdGlhbFR5cGUoKQotCXsKLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IFhTTFRSdW50aW1lLmdldERlZmF1bHRQcm9jZXNzb3IoKTsKLQkJaWYgKGluc3RhbGwgIT0gWFNMVFJ1bnRpbWUuZ2V0SlJFRGVmYXVsdFByb2Nlc3NvcigpKQotCQkJcmV0dXJuIGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpOwotCQlyZXR1cm4gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpWzBdOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0JewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotCXsKLQkJSVByb2Nlc3NvclR5cGVbXSB0eXBlcyA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGVzKCk7Ci0JCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IHR5cGVzKQotCQl7Ci0JCQl0eXBlRmVhdHVyZU1hcC5wdXQodHlwZSwgbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKSk7Ci0JCX0KLQkJY1ZpZXdlci5zZXRJbnB1dChYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpKTsKLQkJY1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0SW5pdGlhbFR5cGUoKSksIHRydWUpOwotCQkKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLQl7Ci0JCWZlYXR1cmVzQmxvY2suc2F2ZUNvbHVtblNldHRpbmdzKCk7Ci0JCWZpbmFsIGJvb2xlYW5bXSBvayA9IG5ldyBib29sZWFuWzFdOwotCQl0cnkKLQkJewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJWFNMVFJ1bnRpbWUuc2F2ZUZlYXR1cmVQcmVmZXJlbmNlcyh0eXBlRmVhdHVyZU1hcCxtb25pdG9yKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCQl7Ci0JCQkJCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJCQkJfQotCQkJCQlva1swXSA9ICFtb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQkJWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuYnVzeUN1cnNvcldoaWxlKHJ1bm5hYmxlKTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG9rWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1ZWIyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuSW5zdGFsbFN0YW5kaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuUHJvY2Vzc29yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3NvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMVFJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2sgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlQmxvY2sgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLXsKLQlwcml2YXRlIENvbXBvc2l0ZSBmQ29udHJvbDsKLQlwcml2YXRlIGZpbmFsIExpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOwotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBmQWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGZSZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZkVkaXRCdXR0b247Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgZlNlbGVjdGlvbkxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlwcml2YXRlIElTZWxlY3Rpb24gZlByZXZTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlmU2VsZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlmU2VsZWN0aW9uTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLQl7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQl7Ci0JCQlpZiAoIXNlbGVjdGlvbi5lcXVhbHMoZlByZXZTZWxlY3Rpb24pKQotCQkJewotCQkJCWZQcmV2U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJCU9iamVjdCBqcmUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChqcmUgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXRhYmxlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0WzBdKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKG5ldyBPYmplY3RbXQotCQkJCQl7IGpyZSB9KTsKLQkJCQkJdGFibGVWaWV3ZXIucmV2ZWFsKGpyZSk7Ci0JCQkJfQotCQkJCWZpcmVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikKLQl7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUZvbnQgZm9udCA9IGFuY2VzdG9yLmdldEZvbnQoKTsKLQkJcGFyZW50LnNldEZvbnQoZm9udCk7Ci0JCWZDb250cm9sID0gcGFyZW50OwotCi0JCUdyaWREYXRhIGRhdGE7Ci0KLQkJTGFiZWwgdGFibGVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGFibGVMYWJlbC5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLkluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18wKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZUxhYmVsLnNldEZvbnQoZm9udCk7Ci0KLQkJVGFibGUgZlRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDQ1MDsKLQkJZlRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZUYWJsZS5zZXRGb250KGZvbnQpOwotCi0JCWZUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlmVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4oZlRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0V2lkdGgoMTgwKTsKLQkJY29sdW1uMS5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChQcm9jZXNzb3JNZXNzYWdlcy5JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfMSk7Ci0JCWNvbHVtbjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJc29ydEJ5TmFtZSgpOwotCQkJfQotCQl9KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKGZUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFdpZHRoKDkwKTsKLQkJY29sdW1uMi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWNvbHVtbjIuc2V0VGV4dChQcm9jZXNzb3JNZXNzYWdlcy5JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfMik7Ci0JCWNvbHVtbjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJc29ydEJ5VHlwZSgpOwotCQkJfQotCQl9KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW40ID0gbmV3IFRhYmxlQ29sdW1uKGZUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW40LnNldFdpZHRoKDE4MCk7Ci0JCWNvbHVtbjQuc2V0UmVzaXphYmxlKHRydWUpOwotCQljb2x1bW40LnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzQpOwotCQljb2x1bW40LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCXNvcnRCeVZlcnNpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihmVGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWTUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc29yc0NvbnRlbnRQcm92aWRlcigpKTsKLQotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldnQpCi0JCQl7Ci0JCQkJZW5hYmxlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQl0YWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCWlmIChldmVudC5nZXRDaGVja2VkKCkpCi0JCQkJewotCQkJCQlzZXRDaGVja2VkSW5zdGFsbCgoSVByb2Nlc3Nvckluc3RhbGwpIGV2ZW50LmdldEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXNldENoZWNrZWRJbnN0YWxsKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGUpCi0JCQl7Ci0JCQkJaWYgKCF0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQkJewotCQkJCQllZGl0UHJvY2Vzc29yKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZlRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KQotCQkJewotCQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkRFTCAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkKLQkJCQl7Ci0JCQkJCXJlbW92ZVByb2Nlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbnMuc2V0Rm9udChmb250KTsKLQotCQlmQWRkQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zLCBQcm9jZXNzb3JNZXNzYWdlcy5JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfNSk7Ci0JCWZBZGRCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KQotCQkJewotCQkJCWFkZFByb2Nlc3NvcigpOwotCQkJfQotCQl9KTsKLQotCQlmRWRpdEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oYnV0dG9ucywgUHJvY2Vzc29yTWVzc2FnZXMuSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzYpOwotCQlmRWRpdEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpCi0JCQl7Ci0JCQkJZWRpdFByb2Nlc3NvcigpOwotCQkJfQotCQl9KTsKLQotCQlmUmVtb3ZlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zLCBQcm9jZXNzb3JNZXNzYWdlcy5JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfNyk7Ci0JCWZSZW1vdmVCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KQotCQkJewotCQkJCXJlbW92ZVByb2Nlc3NvcnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY29waWVkIGZyb20gTGlzdERpYWxvZ0ZpZWxkLkNyZWF0ZVNlcGFyYXRvcigpCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChidXR0b25zLCBTV1QuTk9ORSk7Ci0JCXNlcGFyYXRvci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlnZC5oZWlnaHRIaW50ID0gNDsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZpbGxXaXRoV29ya3NwYWNlUHJvY2Vzc29ycygpOwotCQllbmFibGVCdXR0b25zKCk7Ci0KLQkJcmVzdG9yZUNvbHVtblNldHRpbmdzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFdpdGhXb3Jrc3BhY2VQcm9jZXNzb3JzKCkKLQl7Ci0JCUxpc3Q8SW5zdGFsbFN0YW5kaW4+IHN0YW5kaW5zID0gbmV3IEFycmF5TGlzdDxJbnN0YWxsU3RhbmRpbj4oKTsKLQkJSVByb2Nlc3NvclR5cGVbXSB0eXBlcyA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGVzKCk7Ci0JCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IHR5cGVzKQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29ycyh0eXBlLmdldElkKCkpOwotCQkJZm9yIChJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsIDogaW5zdGFsbHMpCi0JCQl7Ci0JCQkJc3RhbmRpbnMuYWRkKG5ldyBJbnN0YWxsU3RhbmRpbihpbnN0YWxsKSk7Ci0JCQl9Ci0JCX0KLQkJc2V0UHJvY2Vzc29ycygoSVByb2Nlc3Nvckluc3RhbGxbXSkgc3RhbmRpbnMudG9BcnJheShuZXcgSVByb2Nlc3Nvckluc3RhbGxbc3RhbmRpbnMuc2l6ZSgpXSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZCgpCi0JewotCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIGdldFNlbGVjdGlvbigpKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gZlNlbGVjdGlvbkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IGxpc3RlbmVycykKLQkJewotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBlbGVtZW50OwotCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb3J0cyBieSB0eXBlLCBhbmQgbmFtZSB3aXRoaW4gdHlwZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc29ydEJ5VHlwZSgpCi0JewotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKQotCQkJewotCQkJCUlQcm9jZXNzb3JJbnN0YWxsIGxlZnQgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGUxOwotCQkJCUlQcm9jZXNzb3JJbnN0YWxsIHJpZ2h0ID0gKElQcm9jZXNzb3JJbnN0YWxsKSBlMjsKLQkJCQlyZXR1cm4gbGVmdC5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0TGFiZWwoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldFByb2Nlc3NvclR5cGUoKS5nZXRMYWJlbCgpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzb3J0QnlWZXJzaW9uKCkKLQl7Ci0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgbGVmdCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgZTE7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgcmlnaHQgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGUyOwotCQkJCXJldHVybiBsZWZ0LmdldFN1cHBvcnRzKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXRTdXBwb3J0cygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFNvcnRzIGJ5IG5hbWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNvcnRCeU5hbWUoKQotCXsKLQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikKLQkJCXsKLQkJCQlpZiAoKGUxIGluc3RhbmNlb2YgSVByb2Nlc3Nvckluc3RhbGwpICYmIChlMiBpbnN0YW5jZW9mIElQcm9jZXNzb3JJbnN0YWxsKSkKLQkJCQl7Ci0JCQkJCUlQcm9jZXNzb3JJbnN0YWxsIGxlZnQgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGUxOwotCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCByaWdodCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgZTI7Ci0JCQkJCXJldHVybiBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbmFibGVCdXR0b25zKCkKLQl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWludCBzZWxlY3Rpb25Db3VudCA9IHNlbGVjdGlvbi5zaXplKCk7Ci0JCWZFZGl0QnV0dG9uLnNldEVuYWJsZWQoc2VsZWN0aW9uQ291bnQgPT0gMSAmJiAhKChJUHJvY2Vzc29ySW5zdGFsbClzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmlzQ29udHJpYnV0ZWQoKSk7Ci0JCWlmIChzZWxlY3Rpb25Db3VudCA+IDAgJiYgc2VsZWN0aW9uQ291bnQgPCB0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpKQotCQl7Ci0JCQlJdGVyYXRvcjw/PiBpdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCXsKLQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGluc3RhbGwuaXNDb250cmlidXRlZCgpKQotCQkJCXsKLQkJCQkJZlJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWZSZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKQotCXsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkKLQl7Ci0JCXJldHVybiBmQ29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9jZXNzb3JzKElQcm9jZXNzb3JJbnN0YWxsW10gdm1zKQotCXsKLQkJcHJvY2Vzc29ycy5jbGVhcigpOwotCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGVsZW1lbnQgOiB2bXMpCi0JCXsKLQkJCXByb2Nlc3NvcnMuYWRkKGVsZW1lbnQpOwotCQl9Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KHByb2Nlc3NvcnMpOwotCQkvLyB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0UHJvY2Vzc29ycygpCi0JewotCQlyZXR1cm4gKElQcm9jZXNzb3JJbnN0YWxsW10pIHByb2Nlc3NvcnMudG9BcnJheShuZXcgSVByb2Nlc3Nvckluc3RhbGxbcHJvY2Vzc29ycy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJvY2Vzc29yKCkKLQl7Ci0JCUFkZFByb2Nlc3NvckRpYWxvZyBkaWFsb2cgPSBuZXcgQWRkUHJvY2Vzc29yRGlhbG9nKHRoaXMsIGdldFNoZWxsKCksIFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGVzRXhjbEpSRURlZmF1bHQoKSwgbnVsbCk7Ci0JCWRpYWxvZy5zZXRUaXRsZShQcm9jZXNzb3JNZXNzYWdlcy5BZGRQcm9jZXNzb3JEaWFsb2dfQWRkX1RpdGxlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzb3JBZGRlZChJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJcHJvY2Vzc29ycy5hZGQoaW5zdGFsbCk7Ci0JCXRhYmxlVmlld2VyLmFkZChpbnN0YWxsKTsKLQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGluc3RhbGwpLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0R1cGxpY2F0ZU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvcnMuc2l6ZSgpOyBpKyspCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSAoSVByb2Nlc3Nvckluc3RhbGwpIHByb2Nlc3NvcnMuZ2V0KGkpOwotCQkJaWYgKGluc3RhbGwuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRQcm9jZXNzb3IoKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoaW5zdGFsbCA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCFpbnN0YWxsLmlzQ29udHJpYnV0ZWQoKSkKLQkJewotLy8JCQlQcm9jZXNzb3JEZXRhaWxzRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9jZXNzb3JEZXRhaWxzRGlhbG9nKGdldFNoZWxsKCksIGluc3RhbGwpOwotLy8JCQlkaWFsb2cub3BlbigpOwotLy8JCX0KLS8vCQllbHNlCi0vLwkJewotCQkJQWRkUHJvY2Vzc29yRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRQcm9jZXNzb3JEaWFsb2codGhpcywgZ2V0U2hlbGwoKSwgWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXNFeGNsSlJFRGVmYXVsdCgpLCBpbnN0YWxsKTsKLQkJCWRpYWxvZy5zZXRUaXRsZShQcm9jZXNzb3JNZXNzYWdlcy5BZGRQcm9jZXNzb3JEaWFsb2dfRWRpdF9UaXRsZSk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spCi0JCQl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gZmlsbFdpdGhXb3Jrc3BhY2VQcm9jZXNzb3JzKCk7Ci0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvY2Vzc29ycygpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlJUHJvY2Vzc29ySW5zdGFsbFtdIHZtcyA9IG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtzZWxlY3Rpb24uc2l6ZSgpXTsKLQkJSXRlcmF0b3I8Pz4gaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkKLQkJewotCQkJdm1zW2ldID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlyZW1vdmVQcm9jZXNzb3JzKHZtcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvY2Vzc29ycyhJUHJvY2Vzc29ySW5zdGFsbFtdIHRoZUluc3RhbGxzKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcHJldiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoSVByb2Nlc3Nvckluc3RhbGwgZWxlbWVudCA6IHRoZUluc3RhbGxzKQotCQl7Ci0JCQlwcm9jZXNzb3JzLnJlbW92ZShlbGVtZW50KTsKLQkJfQotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnIgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlpZiAoIWN1cnIuZXF1YWxzKHByZXYpKQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzID0gZ2V0UHJvY2Vzc29ycygpOwotCQkJaWYgKGN1cnIuc2l6ZSgpID09IDAgJiYgaW5zdGFsbHMubGVuZ3RoID09IDEpCi0JCQl7Ci0JCQkJLy8gcGljayBhIGRlZmF1bHQgaW5zdGFsbCBhdXRvbWF0aWNhbGx5Ci0JCQkJc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGluc3RhbGxzWzBdKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrZWRJbnN0YWxsKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCi0JewotCQlpZiAoaW5zdGFsbCA9PSBudWxsKQotCQl7Ci0JCQlzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5zdGFsbCkpOwotCQl9Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnN0YWxsIGdldENoZWNrZWRJbnN0YWxsKCkKLQl7Ci0JCU9iamVjdFtdIG9iamVjdHMgPSB0YWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJaWYgKG9iamVjdHMubGVuZ3RoID09IDApCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSVByb2Nlc3Nvckluc3RhbGwpIG9iamVjdHNbMF07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0U29ydENvbHVtbihpbnQgY29sdW1uKQotCXsKLQkJc3dpdGNoIChjb2x1bW4pCi0JCXsKLQkJCWNhc2UgMToKLQkJCQlzb3J0QnlOYW1lKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJc29ydEJ5VHlwZSgpOwotCQkJCWJyZWFrOwotCQl9Ci0JCXN1cGVyLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0VGFibGUoKQotCXsKLQkJcmV0dXJuIHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSUNvbnN0YW50cy5QUk9DRVNTT1JfREVUQUlMU19ESUFMT0c7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzb3JzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpCi0JCXsKLQkJCXJldHVybiBwcm9jZXNzb3JzLnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCXsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVk1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQl7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9jZXNzb3JJbnN0YWxsKQotCQkJewotCQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGVsZW1lbnQ7Ci0JCQkJc3dpdGNoIChjb2x1bW5JbmRleCkKLQkJCQl7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiBpbnN0YWxsLmdldE5hbWUoKTsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcmV0dXJuIGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldExhYmVsKCk7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCWlmIChpbnN0YWxsLmdldERlYnVnZ2VyKCkgIT0gbnVsbCkKLQkJCQkJCXsKLQkJCQkJCQlyZXR1cm4gaW5zdGFsbC5nZXREZWJ1Z2dlcigpLmdldE5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfODsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjExNmRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9PdXRwdXRCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL091dHB1dEJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjI0NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL091dHB1dEJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklPdXRwdXRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLQotcHVibGljIGNsYXNzIE91dHB1dEJsb2NrIGV4dGVuZHMgQWJzdHJhY3RUYWJsZUJsb2NrCi17Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRWaWV3ZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJQ29uc3RhbnRzLk9VVFBVVF9CTE9DSzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0VGFibGUoKQotCXsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNldENvbnRyb2wodGFibGUpOwotCi0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBjMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljMS5zZXRXaWR0aCg0NTApOwotCQljMS5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWMxLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJPdXRwdXRCbG9jay4wIikpOyAvLyROT04tTkxTLTEkCi0KLQkJVGFibGVDb2x1bW4gYzIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJYzIuc2V0V2lkdGgoMTUwKTsKLQkJYzIuc2V0UmVzaXphYmxlKHRydWUpOwotCQljMi5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiT3V0cHV0QmxvY2suMSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKQotCQl7Ci0KLQkJCXByaXZhdGUgSU91dHB1dFByb3BlcnR5W10gYWxsUHJvcGVydGllczsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIGFsbFByb3BlcnRpZXM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQkJYWxsUHJvcGVydGllcyA9IChJT3V0cHV0UHJvcGVydHlbXSkgbmV3SW5wdXQ7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQkJewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQkJCXsKLQkJCQlJT3V0cHV0UHJvcGVydHkgcHJvcCA9IChJT3V0cHV0UHJvcGVydHkpIGVsZW1lbnQ7Ci0JCQkJc3dpdGNoIChjb2x1bW5JbmRleCkKLQkJCQl7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiBwcm9wLmdldFVSSSgpOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlyZXR1cm4gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcC5nZXRVUkkoKSk7Ci0JCQkJfQotCQkJCXJldHVybiAiISEiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl7Ci0JCQl9Ci0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10KLQkJeyBNZXNzYWdlcy5nZXRTdHJpbmcoIk91dHB1dEJsb2NrLjIiKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJPdXRwdXRCbG9jay40IikgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0Vmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpCi0JCXsKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIk91dHB1dEJsb2NrLjUiKS5lcXVhbHMocHJvcGVydHkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlJT3V0cHV0UHJvcGVydHkgcHJvcCA9IChJT3V0cHV0UHJvcGVydHkpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcC5nZXRVUkkoKSk7Ci0JCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0JCQl7Ci0JCQkJSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0JCQkJSU91dHB1dFByb3BlcnR5IHByb3AgPSAoSU91dHB1dFByb3BlcnR5KSBpdGVtLmdldERhdGEoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpKSAvLyROT04tTkxTLTEkCi0JCQkJCXByb3BlcnRpZXMucmVtb3ZlKHByb3AuZ2V0VVJJKCkpOwotCQkJCWVsc2UKLQkJCQkJcHJvcGVydGllcy5wdXQocHJvcC5nZXRVUkkoKSwgdmFsdWUpOwotCQkJCXRWaWV3ZXIudXBkYXRlKHByb3AsIG51bGwpOwotCQkJfQotCQl9KTsKLQkJdFZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKQotCQkJewotCQkJCUlPdXRwdXRQcm9wZXJ0eSBwcm9wMSA9IChJT3V0cHV0UHJvcGVydHkpIGUxOwotCQkJCUlPdXRwdXRQcm9wZXJ0eSBwcm9wMiA9IChJT3V0cHV0UHJvcGVydHkpIGUyOwotCQkJCXJldHVybiBwcm9wMS5nZXRVUkkoKS5jb21wYXJlVG8ocHJvcDIuZ2V0VVJJKCkpOwotCQkJfQotCQl9KTsKLQotCQlUZXh0Q2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCi0JCUNlbGxFZGl0b3JbXSBlZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbXQotCQl7IG51bGwsIGVkaXRvciB9OwotCQl0Vmlld2VyLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotCi0JCXJlc3RvcmVDb2x1bW5TZXR0aW5ncygpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQl0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotCQl0Vmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhJUHJvY2Vzc29yVHlwZSB0eXBlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpCi0JewotCQl0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KElPdXRwdXRQcm9wZXJ0eVtdIGtleXMpCi0JewotCQl0Vmlld2VyLnNldElucHV0KGtleXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL091dHB1dFByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvT3V0cHV0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhNDg2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvT3V0cHV0UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSU91dHB1dFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotewotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY1ZpZXdlcjsKLQlwcml2YXRlIE91dHB1dEJsb2NrIG91dHB1dEJsb2NrOwotCXByaXZhdGUgT3V0cHV0QmxvY2sgc3RhbmRhcmRPdXRwdXRCbG9jazsKLQlwcml2YXRlIE1hcDxJUHJvY2Vzc29yVHlwZSwgUHJvcGVydGllcz4gdHlwZVByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXA8SVByb2Nlc3NvclR5cGUsIFByb3BlcnRpZXM+KCk7Ci0JcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uVGV4dDsKLQotCXB1YmxpYyBPdXRwdXRQcmVmZXJlbmNlUGFnZSgpCi0JewotCQlzdXBlcigpOwotCQlzZXRUaXRsZShNZXNzYWdlcy5nZXRTdHJpbmcoIk91dHB1dFByZWZlcmVuY2VQYWdlLjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJPdXRwdXRQcmVmZXJlbmNlUGFnZS4xIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJPdXRwdXRQcmVmZXJlbmNlUGFnZS4yIikpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLmhlaWdodEhpbnQgPSAxNTA7Ci0JCWdkLndpZHRoSGludCA9IDQ1MDsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXN0YW5kYXJkT3V0cHV0QmxvY2sgPSBuZXcgT3V0cHV0QmxvY2soKTsKLQkJc3RhbmRhcmRPdXRwdXRCbG9jay5jcmVhdGVDb250cm9sKGdyb3VwKTsKLQkJc3RhbmRhcmRPdXRwdXRCbG9jay5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpCi0JCQkJCXRleHQgPSAoKElPdXRwdXRQcm9wZXJ0eSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KHRleHQgPT0gbnVsbCA/ICIiIDogdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCXN0YW5kYXJkT3V0cHV0QmxvY2suZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCi0JCWdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiT3V0cHV0UHJlZmVyZW5jZVBhZ2UuNCIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTk9ORSwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIk91dHB1dFByZWZlcmVuY2VQYWdlLjUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuU0lOR0xFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULk5PTkUsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCWNWaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOwotCQljVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKQotCQl7Ci0KLQkJCXByaXZhdGUgSVByb2Nlc3NvclR5cGVbXSB0eXBlczsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIHR5cGVzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotCQkJewotCQkJCXR5cGVzID0gKElQcm9jZXNzb3JUeXBlW10pIG5ld0lucHV0OwotCQkJfQotCQl9KTsKLQkJY1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0JCQl7Ci0JCQkJSVByb2Nlc3NvclR5cGUgdHlwZSA9IChJUHJvY2Vzc29yVHlwZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gdHlwZS5nZXRMYWJlbCgpOwotCQkJfQotCQl9KTsKLQkJY1ZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKQotCQkJewotCQkJCUlQcm9jZXNzb3JUeXBlIHR5cGUxID0gKElQcm9jZXNzb3JUeXBlKSBlMTsKLQkJCQlJUHJvY2Vzc29yVHlwZSB0eXBlMiA9IChJUHJvY2Vzc29yVHlwZSkgZTI7Ci0JCQkJcmV0dXJuIHR5cGUxLmdldExhYmVsKCkuY29tcGFyZVRvKHR5cGUyLmdldExhYmVsKCkpOwotCQkJfQotCQl9KTsKLQkJY1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCUlQcm9jZXNzb3JUeXBlIHR5cGUgPSAoSVByb2Nlc3NvclR5cGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKQotCQkJCXsKLQkJCQkJb3V0cHV0QmxvY2suc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXModHlwZSwgKFByb3BlcnRpZXMpIHR5cGVQcm9wZXJ0eU1hcC5nZXQodHlwZSkpOwotCQkJCQlvdXRwdXRCbG9jay5zZXRJbnB1dCh0eXBlLmdldE91dHB1dFByb3BlcnRpZXMoKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCW91dHB1dEJsb2NrLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKHR5cGUsIG5ldyBQcm9wZXJ0aWVzKCkpOwotCQkJCQlvdXRwdXRCbG9jay5zZXRJbnB1dChuZXcgSU91dHB1dFByb3BlcnR5WzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkKLQkJewotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpCi0JCQl7Ci0JCQkJSVByb2Nlc3NvclR5cGUgdHlwZSA9IChJUHJvY2Vzc29yVHlwZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gIXR5cGUuZXF1YWxzKFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGUoWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX1RZUEVfSUQpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJb3V0cHV0QmxvY2sgPSBuZXcgT3V0cHV0QmxvY2soKTsKLQkJb3V0cHV0QmxvY2suY3JlYXRlQ29udHJvbChncm91cCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJb3V0cHV0QmxvY2suZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQlzdGFuZGFyZE91dHB1dEJsb2NrLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJb3V0cHV0QmxvY2suYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKQotCQkJCXsKLQkJCQkJdGV4dCA9ICgoSU91dHB1dFByb3BlcnR5KSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJfQotCQkJCWRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KHRleHQgPT0gbnVsbCA/ICIiIDogdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0KLQkJZGVzY3JpcHRpb25UZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuV1JBUCB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZIHwgU1dULlZfU0NST0xMKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IDYwOwotCQlkZXNjcmlwdGlvblRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJc2V0SW5wdXQoKTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbnB1dCgpCi0JewotCQlJUHJvY2Vzc29yVHlwZVtdIHR5cGVzID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQkJdHlwZVByb3BlcnR5TWFwLmNsZWFyKCk7Ci0JCWZvciAoSVByb2Nlc3NvclR5cGUgdHlwZSA6IHR5cGVzKQotCQl7Ci0JCQl0eXBlUHJvcGVydHlNYXAucHV0KHR5cGUsIChQcm9wZXJ0aWVzKXR5cGUuZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoKS5jbG9uZSgpKTsKLQkJfQotCi0JCUlQcm9jZXNzb3JUeXBlIGpyZURlZmF1bHRUeXBlID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZShYU0xUUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRCk7Ci0JCXN0YW5kYXJkT3V0cHV0QmxvY2suc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoanJlRGVmYXVsdFR5cGUsIChQcm9wZXJ0aWVzKSB0eXBlUHJvcGVydHlNYXAuZ2V0KGpyZURlZmF1bHRUeXBlKSk7Ci0JCXN0YW5kYXJkT3V0cHV0QmxvY2suc2V0SW5wdXQoanJlRGVmYXVsdFR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpKTsKLQotCQljVmlld2VyLnNldElucHV0KHR5cGVzKTsKLQkJY1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oRmVhdHVyZXNQcmVmZXJlbmNlUGFnZS5nZXRJbml0aWFsVHlwZSgpKSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLQl7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLQl7Ci0JCUlQcm9jZXNzb3JUeXBlW10gdHlwZXMgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpOwotCQl0eXBlUHJvcGVydHlNYXAuY2xlYXIoKTsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogdHlwZXMpCi0JCXsKLQkJCXR5cGVQcm9wZXJ0eU1hcC5wdXQodHlwZSwgWFNMVFJ1bnRpbWUuY3JlYXRlRGVmYXVsdE91dHB1dFByb3BlcnRpZXModHlwZS5nZXRJZCgpKSk7Ci0JCX0KLQotCQlJUHJvY2Vzc29yVHlwZSBqcmVEZWZhdWx0VHlwZSA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGUoWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX1RZUEVfSUQpOwotCQlzdGFuZGFyZE91dHB1dEJsb2NrLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKGpyZURlZmF1bHRUeXBlLCAoUHJvcGVydGllcykgdHlwZVByb3BlcnR5TWFwLmdldChqcmVEZWZhdWx0VHlwZSkpOwotCQlzdGFuZGFyZE91dHB1dEJsb2NrLnNldElucHV0KGpyZURlZmF1bHRUeXBlLmdldE91dHB1dFByb3BlcnRpZXMoKSk7Ci0KLQkJY1ZpZXdlci5zZXRJbnB1dCh0eXBlcyk7Ci0JCWNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKEZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UuZ2V0SW5pdGlhbFR5cGUoKSksIHRydWUpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCQlvdXRwdXRCbG9jay5zYXZlQ29sdW1uU2V0dGluZ3MoKTsKLQkJZmluYWwgYm9vbGVhbltdIG9rID0gbmV3IGJvb2xlYW5bMV07Ci0JCXRyeQotCQl7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCQl7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlYU0xUUnVudGltZS5zYXZlT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyh0eXBlUHJvcGVydHlNYXAsbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCX0KLQkJCQkJb2tbMF0gPSAhbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JCQkJfQotCQkJfTsKLQkJCVhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZShydW5uYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBva1swXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc29yTGlicmFyeUJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc29yTGlicmFyeUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzY0MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3ByZWZlcmVuY2VzL1Byb2Nlc3NvckxpYnJhcnlCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5JbnN0YWxsU3RhbmRpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLkphckNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLkphckxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3Nvci5Qcm9jZXNzb3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yTGlicmFyeUJsb2NrIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1BBVEhfU0VUVElORyA9ICJMQVNUX1BBVEhfU0VUVElORyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1dPUktTUEFDRV9QQVRIX1NFVFRJTkcgPSAiTEFTVF9XT1JLU1BBQ0VfUEFUSF9TRVRUSU5HIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HU19QUkVGSVggPSAiUHJvY2Vzc29yTGlicmFyeUJsb2NrIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJbnN0YWxsU3RhbmRpbiBpbnN0YWxsOwotCXByb3RlY3RlZCBJUHJvY2Vzc29yVHlwZSBpbnN0YWxsVHlwZTsKLQlwcm90ZWN0ZWQgQWRkUHJvY2Vzc29yRGlhbG9nIGFkZERpYWxvZyA9IG51bGw7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gYWRkV29ya3NwYWNlQnV0dG9uOwotCi0JcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkKLQl7Ci0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikKLQkJewotCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmb3IgKE9iamVjdCBlbGVtZW50IDogc2VsZWN0aW9uKQotCQkJewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZvbGRlcikKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWFNMRGVidWdVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCQl7Ci0JCQkJCS8vIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGlvbltpXTsKLQkJCQkJLy8gVE9ETyBjaGVjayB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhbHJlYWR5IG9uIHRoZSBjbGFzc3BhdGgKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotCi0JcHVibGljIFByb2Nlc3NvckxpYnJhcnlCbG9jayhBZGRQcm9jZXNzb3JEaWFsb2cgZGlhbG9nKQotCXsKLQkJYWRkRGlhbG9nID0gZGlhbG9nOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IHRvcExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXRvcExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJdG9wTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXRvcExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KHRvcExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY29tcCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSA2OwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUphckNvbnRlbnRQcm92aWRlciBmTGlicmFyeUNvbnRlbnRQcm92aWRlciA9IG5ldyBKYXJDb250ZW50UHJvdmlkZXIoKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGZMaWJyYXJ5Q29udGVudFByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSmFyTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCUNvbXBvc2l0ZSBwYXRoQnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUoY29tcCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IHBhdGhCdXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlwYXRoQnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXBhdGhCdXR0b25MYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRMYXlvdXQocGF0aEJ1dHRvbkxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXBhdGhCdXR0b25Db21wLnNldExheW91dERhdGEoZ2QpOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRGb250KGZvbnQpOwotCi0JCWFkZFdvcmtzcGFjZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckxpYnJhcnlCbG9ja19BZGRXb3Jrc3BhY2VCdXR0b24pOwotCQlhZGRXb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJYWRkQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZEJ1dHRvbik7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlyZW1vdmVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKHBhdGhCdXR0b25Db21wLCBQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfUmVtb3ZlQnV0dG9uKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJldHVybiBjb21wOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0JewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJYWRkRGlhbG9nLnNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJ0aWNhbFNwYWNlcihDb21wb3NpdGUgY29tcCwgaW50IGNvbFNwYW4pCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSW5zdGFsbFN0YW5kaW4gc3RhbmRpbiwgSVByb2Nlc3NvclR5cGUgdHlwZSkKLQl7Ci0JCWluc3RhbGwgPSBzdGFuZGluOwotCQlpbnN0YWxsVHlwZSA9IHR5cGU7Ci0JCWlmIChpbnN0YWxsICE9IG51bGwpCi0JCQl0YWJsZVZpZXdlci5zZXRJbnB1dChpbnN0YWxsKTsKLQkJdXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBidXR0b25zIGFuZCBzdGF0dXMgYmFzZWQgb24gY3VycmVudCBsaWJyYXJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKQotCXsKLQkJdXBkYXRlQnV0dG9ucygpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChpbnN0YWxsICE9IG51bGwgJiYgaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkubGVuZ3RoID09IDApCi0JCXsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBYU0xEZWJ1Z1VJUGx1Z2luLlBMVUdJTl9JRCwgMCwgUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yTGlicmFyeUJsb2NrXzYsIG51bGwpOwotCQl9Ci0JCWFkZERpYWxvZy5zZXRTeXN0ZW1MaWJyYXJ5U3RhdHVzKHN0YXR1cyk7Ci0JCWFkZERpYWxvZy51cGRhdGVTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KEluc3RhbGxTdGFuZGluIHN0YW5kaW4pCi0JewotCQlzdGFuZGluLnNldFByb2Nlc3NvckphcnMoaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvY2Vzc29ySW5zdGFsbCBnZXRWTUluc3RhbGwoKQotCXsKLQkJcmV0dXJuIGluc3RhbGw7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9jZXNzb3JUeXBlIGdldFZNSW5zdGFsbFR5cGUoKQotCXsKLQkJcmV0dXJuIGluc3RhbGxUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSByZW1vdmVCdXR0b24pCi0JCXsKLQkJCXJlbW92ZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQllbHNlIGlmIChzb3VyY2UgPT0gYWRkQnV0dG9uKQotCQl7Ci0JCQlhZGRFeHRlcm5hbCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQllbHNlIGlmIChzb3VyY2UgPT0gYWRkV29ya3NwYWNlQnV0dG9uKQotCQl7Ci0JCQlhZGRXb3Jrc3BhY2UoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJdXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JewotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFeHRlcm5hbChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlTdHJpbmcgbGFzdFVzZWRQYXRoID0gZGlhbG9nU2V0dGluZ3MuZ2V0KExBU1RfUEFUSF9TRVRUSU5HKTsKLQkJaWYgKGxhc3RVc2VkUGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsYXN0VXNlZFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2codGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIFNXVC5NVUxUSSk7Ci0JCWRpYWxvZy5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckxpYnJhcnlCbG9ja19GaWxlRGlhbG9nX1RpdGxlKTsKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdCi0JCXsgIiouamFyOyouemlwIiB9KTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0VXNlZFBhdGgpOwotCQlTdHJpbmcgcmVzID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nW10gZmlsZU5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQlpbnQgbkNob3NlbiA9IGZpbGVOYW1lcy5sZW5ndGg7Ci0KLQkJSVBhdGggZmlsdGVyUGF0aCA9IG5ldyBQYXRoKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQlJUHJvY2Vzc29ySmFyW10gbGlicyA9IG5ldyBJUHJvY2Vzc29ySmFyW25DaG9zZW5dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaG9zZW47IGkrKykKLQkJewotCQkJbGlic1tpXSA9IFhTTFRSdW50aW1lLmNyZWF0ZVByb2Nlc3NvckphcihmaWx0ZXJQYXRoLmFwcGVuZChmaWxlTmFtZXNbaV0pLm1ha2VBYnNvbHV0ZSgpKTsKLQkJfQotCQlkaWFsb2dTZXR0aW5ncy5wdXQoTEFTVF9QQVRIX1NFVFRJTkcsIGZpbHRlclBhdGgudG9PU1N0cmluZygpKTsKLQotCQlJUHJvY2Vzc29ySmFyW10gY3VycmVudEphcnMgPSBpbnN0YWxsLmdldFByb2Nlc3NvckphcnMoKTsKLQkJSVByb2Nlc3NvckphcltdIG5ld0phcnMgPSBuZXcgSVByb2Nlc3NvckphcltjdXJyZW50SmFycy5sZW5ndGggKyBsaWJzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudEphcnMsIDAsIG5ld0phcnMsIDAsIGN1cnJlbnRKYXJzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkobGlicywgMCwgbmV3SmFycywgY3VycmVudEphcnMubGVuZ3RoLCBsaWJzLmxlbmd0aCk7Ci0JCWluc3RhbGwuc2V0UHJvY2Vzc29ySmFycyhuZXdKYXJzKTsKLQotCQl0YWJsZVZpZXdlci5hZGQobGlicyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFdvcmtzcGFjZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlTdHJpbmcgbGFzdFVzZWRQYXRoID0gZGlhbG9nU2V0dGluZ3MuZ2V0KExBU1RfV09SS1NQQUNFX1BBVEhfU0VUVElORyk7Ci0JCUlQYXRoIGxhc3RQYXRoID0gbnVsbDsKLQkJaWYgKGxhc3RVc2VkUGF0aCAhPSBudWxsKQotCQl7Ci0JCQlsYXN0UGF0aCA9IFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKGxhc3RVc2VkUGF0aCk7Ci0JCX0KLQotCQkvLyBJUmVzb3VyY2UgY3VycmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yTGlicmFyeUJsb2NrX1dvcmtzcGFjZUZpbGVEaWFsb2dfVGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19NZXNzYWdlKTsKLQkJZGlhbG9nLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCQlkaWFsb2cuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpCi0JCQl7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0JCQkJewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJCWlmIChleHRlbnNpb24gPT0gbnVsbCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJcmV0dXJuIGV4dGVuc2lvbi5lcXVhbHMoImphciIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJaWYgKGxhc3RQYXRoICE9IG51bGwpCi0JCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihsYXN0UGF0aCk7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBSZXNvdXJjZUNvbXBhcmF0b3IoUmVzb3VyY2VDb21wYXJhdG9yLk5BTUUpKTsKLQkJZGlhbG9nLnNldEFsbG93TXVsdGlwbGUodHJ1ZSk7Ci0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKQotCQkJewotCQkJCUlQcm9jZXNzb3JKYXJbXSBsaWJzID0gbmV3IElQcm9jZXNzb3JKYXJbZWxlbWVudHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSUZpbGUgamFyID0gKElGaWxlKSBlbGVtZW50c1tpXTsKLQkJCQkJbGlic1tpXSA9IFhTTFRSdW50aW1lLmNyZWF0ZVByb2Nlc3NvckphcihqYXIuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJCUlQcm9jZXNzb3JKYXJbXSBjdXJyZW50SmFycyA9IGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpOwotCQkJCUlQcm9jZXNzb3JKYXJbXSBuZXdKYXJzID0gbmV3IElQcm9jZXNzb3JKYXJbY3VycmVudEphcnMubGVuZ3RoICsgbGlicy5sZW5ndGhdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudEphcnMsIDAsIG5ld0phcnMsIDAsIGN1cnJlbnRKYXJzLmxlbmd0aCk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShsaWJzLCAwLCBuZXdKYXJzLCBjdXJyZW50SmFycy5sZW5ndGgsIGxpYnMubGVuZ3RoKTsKLQkJCQlpbnN0YWxsLnNldFByb2Nlc3NvckphcnMobmV3SmFycyk7Ci0KLQkJCQl0YWJsZVZpZXdlci5hZGQobGlicyk7Ci0KLQkJCQlsYXN0UGF0aCA9IGxpYnNbMF0uZ2V0UGF0aCgpOwotCQkJCWxhc3RQYXRoID0gbGFzdFBhdGgudXB0b1NlZ21lbnQobGFzdFBhdGguc2VnbWVudENvdW50KCkpOwotCQkJCWRpYWxvZ1NldHRpbmdzLnB1dChMQVNUX1dPUktTUEFDRV9QQVRIX1NFVFRJTkcsIGxhc3RQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCUxpc3Q8SVByb2Nlc3Nvckphcj4gY3VycmVudEphcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JKYXI+KEFycmF5cy5hc0xpc3QoaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCkpKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJY3VycmVudEphcnMucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJfQotCQlpbnN0YWxsLnNldFByb2Nlc3NvckphcnMoKElQcm9jZXNzb3JKYXJbXSkgY3VycmVudEphcnMudG9BcnJheShuZXcgSVByb2Nlc3NvckphclswXSkpOwotCQl0YWJsZVZpZXdlci5yZW1vdmUoc2VsZWN0aW9uLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JewotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiZTQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xUUnVudGltZTsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0JcHJpdmF0ZSBJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2sgcHJvY2Vzc29yc0Jsb2NrOwotCi0JcHVibGljIFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSgpCi0JewotCQlzdXBlcigpOwotCQkvLyBvbmx5IHVzZWQgd2hlbiBwYWdlIGlzIHNob3duIHByb2dyYW1hdGljYWxseQotCQlzZXRUaXRsZShNZXNzYWdlcy5nZXRTdHJpbmcoIlByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZS4wIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlLjEiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotCXsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpCi0JewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoYW5jZXN0b3IpOwotCi0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlhbmNlc3Rvci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlwcm9jZXNzb3JzQmxvY2sgPSBuZXcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrKCk7Ci0JCXByb2Nlc3NvcnNCbG9jay5jcmVhdGVDb250cm9sKGFuY2VzdG9yKTsKLQkJQ29udHJvbCBjb250cm9sID0gcHJvY2Vzc29yc0Jsb2NrLmdldENvbnRyb2woKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscC4uLgotCi0JCWluaXREZWZhdWx0SW5zdGFsbCgpOwotCQlwcm9jZXNzb3JzQmxvY2suYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldEN1cnJlbnREZWZhdWx0UHJvY2Vzc29yKCk7Ci0JCQkJaWYgKGluc3RhbGwgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmdldFN0cmluZygiUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlLjIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlhcHBseURpYWxvZ0ZvbnQoYW5jZXN0b3IpOwotCQlyZXR1cm4gYW5jZXN0b3I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLQl7Ci0JCXByb2Nlc3NvcnNCbG9jay5zYXZlQ29sdW1uU2V0dGluZ3MoKTsKLQkJZmluYWwgYm9vbGVhbltdIG9rID0gbmV3IGJvb2xlYW5bMV07Ci0JCXRyeQotCQl7Ci0JCQlmaW5hbCBJUHJvY2Vzc29ySW5zdGFsbFtdIGluc3RhbGxzID0gcHJvY2Vzc29yc0Jsb2NrLmdldFByb2Nlc3NvcnMoKTsKLQkJCWZpbmFsIElQcm9jZXNzb3JJbnN0YWxsIGRlZmF1bHRQcm9jZXNzb3IgPSBnZXRDdXJyZW50RGVmYXVsdFByb2Nlc3NvcigpOwotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJWFNMVFJ1bnRpbWUuc2F2ZVByb2Nlc3NvclByZWZlcmVuY2VzKGluc3RhbGxzLGRlZmF1bHRQcm9jZXNzb3IsbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCX0KLQkJCQkJb2tbMF0gPSAhbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JCQkJfQotCQkJfTsKLQkJCVhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZShydW5uYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBva1swXTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRJbnN0YWxsKCkKLQl7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsIHJlYWxEZWZhdWx0ID0gWFNMVFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpOwotCQlpZiAocmVhbERlZmF1bHQgIT0gbnVsbCkKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscyA9IHByb2Nlc3NvcnNCbG9jay5nZXRQcm9jZXNzb3JzKCk7Ci0JCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGZha2VJbnN0YWxsIDogaW5zdGFsbHMpCi0JCQl7Ci0JCQkJaWYgKGZha2VJbnN0YWxsLmdldElkKCkuZXF1YWxzKHJlYWxEZWZhdWx0LmdldElkKCkpKQotCQkJCXsKLQkJCQkJdmVyaWZ5RGVmYXVsdFZNKGZha2VJbnN0YWxsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlZmF1bHRWTShJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJaWYgKGluc3RhbGwgIT0gbnVsbCkKLQkJewotCQkJcHJvY2Vzc29yc0Jsb2NrLnNldENoZWNrZWRJbnN0YWxsKGluc3RhbGwpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJvY2Vzc29yc0Jsb2NrLnNldENoZWNrZWRJbnN0YWxsKG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBnZXRDdXJyZW50RGVmYXVsdFByb2Nlc3NvcigpCi0JewotCQlyZXR1cm4gcHJvY2Vzc29yc0Jsb2NrLmdldENoZWNrZWRJbnN0YWxsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvcHJlZmVyZW5jZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmZiZWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotRmVhdHVyZXNCbG9jay4wPUZlYXR1cmUKLUZlYXR1cmVzQmxvY2suMT1UeXBlCi1GZWF0dXJlc0Jsb2NrLjI9VmFsdWUKLUZlYXR1cmVzQmxvY2suNT1uYW1lCi1GZWF0dXJlc0Jsb2NrLjY9dHlwZQotRmVhdHVyZXNCbG9jay43PXZhbHVlCi1GZWF0dXJlc0Jsb2NrLjg9dmFsdWUKLUZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UuMD1Qcm9jZXNzb3IgRmVhdHVyZXMKLUZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UuMT1TZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGluc3RhbGxlZCBwcm9jZXNzb3IgdHlwZXMKLUZlYXR1cmVzUHJlZmVyZW5jZVBhZ2UuMj1Qcm9jZXNzb3IgVHlwZTogCi1PdXRwdXRCbG9jay4wPVByb3BlcnR5Ci1PdXRwdXRCbG9jay4xPVZhbHVlCi1PdXRwdXRCbG9jay4yPW5hbWUKLU91dHB1dEJsb2NrLjQ9dmFsdWUKLU91dHB1dEJsb2NrLjU9dmFsdWUKLU91dHB1dFByZWZlcmVuY2VQYWdlLjA9T3V0cHV0IFByb3BlcnRpZXMKLU91dHB1dFByZWZlcmVuY2VQYWdlLjE9U2V0IG91dHB1dCBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQgZm9yIGFsbCB0cmFuc2Zvcm1hdGlvbnMKLU91dHB1dFByZWZlcmVuY2VQYWdlLjI9U3RhbmRhcmQgUHJvcGVydGllcwotT3V0cHV0UHJlZmVyZW5jZVBhZ2UuND1Qcm9jZXNzb3ItU3BlY2lmaWMgUHJvcGVydGllcwotT3V0cHV0UHJlZmVyZW5jZVBhZ2UuNT1Qcm9jZXNzb3IgVHlwZToKLVByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZS4wPUphdmEgWFNMVCBQcm9jZXNzb3JzCi1Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UuMT1BZGQsIHJlbW92ZSBvciBlZGl0IFhTTFQgcHJvY2Vzc29yIGRlZmluaXRpb25zLlxuQnkgZGVmYXVsdCwgdGhlIGNoZWNrZWQgUHJvY2Vzc29yIGlzIHVzZWQgZm9yIGFsbCB0cmFuc2Zvcm1hdGlvbnMuCi1Qcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UuMj1TZWxlY3QgYSBkZWZhdWx0IFhTTFQgUHJvY2Vzc29yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvRk9Gb3JtYXR0ZXJUYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9GT0Zvcm1hdHRlclRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzcwOGNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9GT0Zvcm1hdHRlclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotCi1wdWJsaWMgY2xhc3MgRk9Gb3JtYXR0ZXJUYWIgZXh0ZW5kcyBYU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJpdmF0ZSBmaW5hbCBYU0xGT0NvbWJvQmxvY2sgeHNsZm9CbG9jazsKLQlwcml2YXRlIGZpbmFsIFJlbmRlcmVyQ29uZmlndXJhdGlvbkJsb2NrIGNvbmZpZ0Jsb2NrOwotCi0JcHVibGljIEZPRm9ybWF0dGVyVGFiKCkKLQl7Ci0JCXhzbGZvQmxvY2sgPSBuZXcgWFNMRk9Db21ib0Jsb2NrKCk7Ci0JCWNvbmZpZ0Jsb2NrID0gbmV3IFJlbmRlcmVyQ29uZmlndXJhdGlvbkJsb2NrKCk7Ci0JCXNldEJsb2NrcyhuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXQotCQl7IGNvbmZpZ0Jsb2NrIH0pOwotCX0KLQotCXByaXZhdGUgZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZkNoZWNrTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKQotCXsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkKLQkJewotCQkJaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQl9Ci0JfTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBnZXRDb250cm9sKCk7Ci0KLQkJeHNsZm9CbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCQlDb250cm9sIGNvbnRyb2wgPSB4c2xmb0Jsb2NrLmdldENvbnRyb2woKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQljb25maWdCbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCi0JCS8vIHVzZWZ1bCBiaXQgb2YgY29kZSBpZiB5b3Ugd2FudCB0byBkaXNwbGF5IGV4dHJhIG9wdGlvbnMgd2hlbiBhCi0JCS8vIHBhcnRpY3VsYXIgcHJvY2Vzc29yIGlzIGNob3NlbgotCi0JCS8vIENvbXBvc2l0ZSBkeW5UYWJDb21wID0gbmV3IENvbXBvc2l0ZSh0b3BDb21wLCBTV1QuTk9ORSk7Ci0JCS8vIGR5blRhYkNvbXAuc2V0Rm9udChmb250KTsKLQkJLy8JCQotCQkvLyBzZXREeW5hbWljVGFiSG9sZGVyKGR5blRhYkNvbXApOwotCQkvLyBHcmlkTGF5b3V0IHRhYkhvbGRlckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCS8vIHRhYkhvbGRlckxheW91dC5tYXJnaW5IZWlnaHQ9IDA7Ci0JCS8vIHRhYkhvbGRlckxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJLy8gdGFiSG9sZGVyTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkvLyBnZXREeW5hbWljVGFiSG9sZGVyKCkuc2V0TGF5b3V0KHRhYkhvbGRlckxheW91dCk7Ci0JCS8vIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCS8vIGdldER5bmFtaWNUYWJIb2xkZXIoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gIkZvcm1hdHRlciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKCkKLQl7Ci0KLQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmYzUwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMuZm9ybWF0dGVyLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvUmVuZGVyZXJDb25maWd1cmF0aW9uQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9SZW5kZXJlckNvbmZpZ3VyYXRpb25CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTBhMWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9SZW5kZXJlckNvbmZpZ3VyYXRpb25CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuUmVzb3VyY2VTZWxlY3Rpb25CbG9jazsKLQotcHVibGljIGNsYXNzIFJlbmRlcmVyQ29uZmlndXJhdGlvbkJsb2NrIGV4dGVuZHMgUmVzb3VyY2VTZWxlY3Rpb25CbG9jawotewotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5kZXJlckNvbmZpZ3VyYXRpb25CbG9jay4wIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgdHlwZSkKLQl7Ci0JCXJldHVybiAiIiArIHR5cGU7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2UoKQotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvUmVuZGVyZXJUYWJNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL1JlbmRlcmVyVGFiTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMmU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvUmVuZGVyZXJUYWJNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLmZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZW5kZXJlclRhYk1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5yZW5kZXJlci5SZW5kZXJlclRhYk1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMRk9Db21ib0Jsb2NrX1hTTEZPR3JvdXBUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTEZPQ29tYm9CbG9ja19Ob25lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMRk9Db21ib0Jsb2NrX1NwZWNpZmljWFNMRk9Qcm9jZXNzb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xGT0NvbWJvQmxvY2tfTWFuYWdlWFNMRk9Qcm9jZXNzb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRCbG9ja19YTUxCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRCbG9ja19GT0J1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEJsb2NrX0hUTUxCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRCbG9ja19PdXRwdXRGaWxlc0dyb3VwVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRCbG9ja19PdXRwdXRUeXBlR3JvdXBUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSVJlc29sdmVyQmxvY2tfV29ya2luZ19EaXJlY3RvcnlfODsKLQotCXN0YXRpYwotCXsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFJlbmRlcmVyVGFiTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL1JlbmRlcmVyVGFiTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9SZW5kZXJlclRhYk1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjQyNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL1JlbmRlcmVyVGFiTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVhTTEZPQ29tYm9CbG9ja19YU0xGT0dyb3VwVGl0bGU9WFNMRk8gUHJvY2Vzc29yCi1YU0xGT0NvbWJvQmxvY2tfTm9uZT1Ob25lCi1YU0xGT0NvbWJvQmxvY2tfU3BlY2lmaWNYU0xGT1Byb2Nlc3Nvcj1BbHRlcm5hdGUgUHJvY2Vzc29yOgotWFNMRk9Db21ib0Jsb2NrX01hbmFnZVhTTEZPUHJvY2Vzc29yPUluc3RhbGxlZCBGTyBQcm9jZXNzb3JzCi0KLU91dHB1dEJsb2NrX0hUTUxCdXR0b249SFRNTAotT3V0cHV0QmxvY2tfWE1MQnV0dG9uPVhNTAotT3V0cHV0QmxvY2tfRk9CdXR0b249WFNMRk8gKFBERi9Qb3N0c2NyaXB0KQotT3V0cHV0QmxvY2tfT3V0cHV0VHlwZUdyb3VwVGl0bGU9T3V0cHV0IFR5cGUKLU91dHB1dEJsb2NrX091dHB1dEZpbGVzR3JvdXBUaXRsZT1PdXRwdXQgRmlsZShzKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL1hTTEZPQ29tYm9CbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL1hTTEZPQ29tYm9CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDM4MTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL2Zvcm1hdHRlci9YU0xGT0NvbWJvQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkNvbnRyb2xBY2Nlc3NpYmxlTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0xGT0NvbWJvQmxvY2sKLXsKLQlwcml2YXRlIENvbXBvc2l0ZSBmQ29udHJvbDsKLQlwcml2YXRlIEJ1dHRvbiBub25lQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGFsdGVybmF0ZUJ1dHRvbjsKLQlwcml2YXRlIENvbWJvIGFsdGVybmF0ZUNvbWJvOwotCXByaXZhdGUgQnV0dG9uIG1hbmFnZUJ1dHRvbjsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKQotCXsKLQkJRm9udCBmb250ID0gYW5jZXN0b3IuZ2V0Rm9udCgpOwotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQljb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wLnNldEZvbnQoZm9udCk7Ci0JCWZDb250cm9sID0gY29tcDsKLQotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wLCBTV1QuTlVMTCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRGb250KGZvbnQpOwotCi0JCUdyaWREYXRhIGRhdGE7Ci0JCWdyb3VwLnNldFRleHQoUmVuZGVyZXJUYWJNZXNzYWdlcy5YU0xGT0NvbWJvQmxvY2tfWFNMRk9Hcm91cFRpdGxlKTsKLQotCQlub25lQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJbm9uZUJ1dHRvbi5zZXRUZXh0KFJlbmRlcmVyVGFiTWVzc2FnZXMuWFNMRk9Db21ib0Jsb2NrX05vbmUpOwotCQlub25lQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWlmIChub25lQnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJCXsKLQkJCQkJLy8gc2V0VXNlRGVmYXVsdCgpOwotCQkJCQkvLyBzZXRTdGF0dXMoT0tfU1RBVFVTKTsKLQkJCQkJLy8gZmlyZVByb3BlcnR5Q2hhbmdlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJbm9uZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlub25lQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0KLQkJYWx0ZXJuYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJYWx0ZXJuYXRlQnV0dG9uLnNldFRleHQoUmVuZGVyZXJUYWJNZXNzYWdlcy5YU0xGT0NvbWJvQmxvY2tfU3BlY2lmaWNYU0xGT1Byb2Nlc3Nvcik7Ci0JCWFsdGVybmF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlpZiAoYWx0ZXJuYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJCXsKLQkJCQkJLy8gZkNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCS8vIGlmIChmQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDAgJiYgIWZWTXMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIGZDb21iby5zZWxlY3QoMCk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gaWYgKGZWTXMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHNldEVycm9yKE91dHB1dFRhYk1lc3NhZ2VzLlByb2Nlc3NvcnNDb21ib0Jsb2NrXzApOwotCQkJCQkvLyB9IGVsc2UgewotCQkJCQkvLyBzZXRTdGF0dXMoT0tfU1RBVFVTKTsKLQkJCQkJLy8gfQotCQkJCQkvLyBmaXJlUHJvcGVydHlDaGFuZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFsdGVybmF0ZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWFsdGVybmF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWFsdGVybmF0ZUNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWFsdGVybmF0ZUNvbWJvLnNldEZvbnQoZm9udCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWFsdGVybmF0ZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCUNvbnRyb2xBY2Nlc3NpYmxlTGlzdGVuZXIuYWRkTGlzdGVuZXIoYWx0ZXJuYXRlQ29tYm8sIGFsdGVybmF0ZUJ1dHRvbi5nZXRUZXh0KCkpOwotCi0JCWFsdGVybmF0ZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCS8vIGZpcmVQcm9wZXJ0eUNoYW5nZSgpOwotCQkJfQotCQl9KTsKLQotCQltYW5hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0JCW1hbmFnZUJ1dHRvbi5zZXRUZXh0KFJlbmRlcmVyVGFiTWVzc2FnZXMuWFNMRk9Db21ib0Jsb2NrX01hbmFnZVhTTEZPUHJvY2Vzc29yKTsKLQkJbWFuYWdlQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotCQkJewotCQkJCS8vIElQcmVmZXJlbmNlUGFnZSBwYWdlID0gbmV3IFByb2Nlc3NvcnNQcmVmZXJlbmNlUGFnZSgpOwotCQkJCS8vIHNob3dQcmVmUGFnZSgib3JnLmVjbGlwc2Uud3N0LnhzbHQubGF1bmNoaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NvclByZWZlcmVuY2VQYWdlIiwKLQkJCQkvLyBwYWdlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0JewotCQlyZXR1cm4gZkNvbnRyb2w7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvZm9ybWF0dGVyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwOTJkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9mb3JtYXR0ZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVJlbmRlcmVyQ29uZmlndXJhdGlvbkJsb2NrLjA9Q29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9JUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9JUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Q4YTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vSVBhcmFtZXRlcnNDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJhbWV0ZXJzQ2hhbmdlZExpc3RlbmVyCi17Ci0Jdm9pZCBwYXJhbWV0ZXJzQ2hhbmdlZChQYXJhbWV0ZXJWaWV3ZXIgdmlld2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vSVN0eWxlc2hlZXRFbnRyaWVzQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL0lTdHlsZXNoZWV0RW50cmllc0NoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZlNzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vSVN0eWxlc2hlZXRFbnRyaWVzQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotcHVibGljIGludGVyZmFjZSBJU3R5bGVzaGVldEVudHJpZXNDaGFuZ2VkTGlzdGVuZXIKLXsKLQl2b2lkIGVudHJpZXNDaGFuZ2VkKFN0eWxlc2hlZXRWaWV3ZXIgdmlld2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vSW5wdXRGaWxlQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vSW5wdXRGaWxlQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlYWZmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL0lucHV0RmlsZUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5JU3RyaW5nVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlJlc291cmNlU2VsZWN0aW9uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWF0Y2hlcjsKLQotcHVibGljIGNsYXNzIElucHV0RmlsZUJsb2NrIGV4dGVuZHMgUmVzb3VyY2VTZWxlY3Rpb25CbG9jawotewotCXByaXZhdGUgZmluYWwgSUZpbGUgZGVmYXVsdEZpbGU7Ci0JSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQotCXB1YmxpYyBJbnB1dEZpbGVCbG9jayhJRmlsZSBkZWZhdWx0RmlsZSkKLQl7Ci0JCXN1cGVyKElSZXNvdXJjZS5GSUxFLCBmYWxzZSk7Ci0JCXRoaXMuZGVmYXVsdEZpbGUgPSBkZWZhdWx0RmlsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsZUV4dGVuc2lvbnMoKQotCXsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10geG1sQ29udGVudFR5cGVzID0gY29udGVudFR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKTsKLQkJCi0JCXJldHVybiB4bWxDb250ZW50VHlwZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJU3RyaW5nIHBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGVmYXVsdEZpbGUgIT0gbnVsbCkKLQkJCXBhdGggPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLmdlbmVyYXRlVmFyaWFibGVFeHByZXNzaW9uKCJ3b3Jrc3BhY2VfbG9jIiwgZGVmYXVsdEZpbGUuZ2V0RnVsbFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJc2V0TGF1bmNoQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyB3ZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAoU3RyaW5nKSBudWxsKTsKLQkJCWlmICh3ZCAhPSBudWxsKQotCQkJewotCQkJCXNldFRleHQod2QpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXNldEVycm9yTWVzc2FnZShNYWluVGFiTWVzc2FnZXMuSW5wdXRGaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbiArIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKTsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCBnZXRUZXh0KCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX05hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlKCkKLQl7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGV4dE1vZGlmaWVkKCkKLQl7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlTdHJpbmcgd29ya2luZ0RpclBhdGggPSBnZXRUZXh0KCk7Ci0JCWlmICh3b3JraW5nRGlyUGF0aC5pbmRleE9mKCIkeyIpID49IDApIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJSVN0cmluZ1ZhcmlhYmxlTWFuYWdlciBtYW5hZ2VyID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKTsKLQkJCXRyeQotCQkJewotCQkJCW1hbmFnZXIudmFsaWRhdGVTdHJpbmdWYXJpYWJsZXMod29ya2luZ0RpclBhdGgpOwotCQkJCXBhdGggPSBuZXcgUGF0aChtYW5hZ2VyLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24od29ya2luZ0RpclBhdGgpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAod29ya2luZ0RpclBhdGgubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQlwYXRoID0gbmV3IFBhdGgod29ya2luZ0RpclBhdGgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlKGludCB0eXBlKQotCXsKLQkJc3dpdGNoICh0eXBlKQotCQl7Ci0JCQljYXNlIEVSUk9SX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuSW5wdXRGaWxlQmxvY2tfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ7Ci0JCQljYXNlIEVSUk9SX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVDoKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVDsKLQkJCWNhc2UgR1JPVVBfTkFNRToKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX0dST1VQX05BTUU7Ci0JCQljYXNlIFVTRV9ERUZBVUxUX1JBRElPOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuSW5wdXRGaWxlQmxvY2tfREVGQVVMVF9SQURJTzsKLQkJCWNhc2UgVVNFX09USEVSX1JBRElPOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuSW5wdXRGaWxlQmxvY2tfT1RIRVJfUkFESU87Ci0JCQljYXNlIERJUkVDVE9SWV9ESUFMT0dfTUVTU0FHRToKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLklucHV0RmlsZUJsb2NrX0RJQUxPR19NRVNTQUdFOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U6Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U7Ci0JCQljYXNlIFZBUklBQkxFU19CVVRUT046Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19WQVJJQUJMRVNfQlVUVE9OOwotCQkJY2FzZSBGSUxFX1NZU1RFTV9CVVRUT046Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0JCQljYXNlIFdPUktTUEFDRV9CVVRUT046Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5JbnB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX1RJVExFOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuSW5wdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQkJfQotCQlyZXR1cm4gIiIgKyB0eXBlOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb3VyY2VUZXh0KGJvb2xlYW4gdXNlRGVmYXVsdCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9NYWluVGFiTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vTWFpblRhYk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYmQ5NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9NYWluVGFiTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYWluVGFiTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4uTWFpblRhYk1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMTWFpblRhYl9MYWJlbFRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHlsZXNoZWV0RW50cnlMYWJlbFByb3ZpZGVyX0ludmFsaWRfcGF0aDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTE1haW5UYWJfUHJvamVjdF9Hcm91cDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTE1haW5UYWJfQnJvd3NlX1Byb2plY3RzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMTWFpblRhYl9Qcm9qZWN0X0RvZXNfTm90X0V4aXN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNMTWFpblRhYl9Qcm9qZWN0X0Nsb3NlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTE1haW5UYWJfUHJvamVjdF9OYW1lX0ludmFsaWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xNYWluVGFiX0Nob29zZV9Qcm9qZWN0X0RpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTE1haW5UYWJfQ2hvb3NlX1Byb2plY3RfRGlhbG9nX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0xNYWluVGFiX1RyYW5zZm9ybXNfR3JvdXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2Zvcm1zQmxvY2tfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zZm9ybXNCbG9ja19OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19HUk9VUF9OQU1FOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfREVGQVVMVF9SQURJTzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElucHV0RmlsZUJsb2NrX09USEVSX1JBRElPOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfRElBTE9HX01FU1NBR0U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19WQVJJQUJMRVNfQlVUVE9OOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfRklMRV9TWVNURU1fQlVUVE9OOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfV09SS1NQQUNFX0JVVFRPTjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElucHV0RmlsZUJsb2NrX05hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnB1dEZpbGVCbG9ja19FeGNlcHRpb25fb2NjdXJyZWRfcmVhZGluZ19jb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTTE1haW5UYWJfVGFiTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElucHV0RmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9zYXZpbmdfY29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFR5cGVCbG9ja19Hcm91cF9OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0RmlsZUJsb2NrXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfNzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja184OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0RmlsZUJsb2NrXzk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0RmlsZUJsb2NrX0dST1VQX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfREVGQVVMVF9SQURJTzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19PVEhFUl9SQURJTzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfVkFSSUFCTEVTX0JVVFRPTjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfV09SS1NQQUNFX0JVVFRPTjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0RmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9yZWFkaW5nX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZpbGVCbG9ja19FeGNlcHRpb25fb2NjdXJyZWRfc2F2aW5nX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX0dST1VQX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19ERUZBVUxUX1JBRElPOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0Rk9GaWxlQmxvY2tfT1RIRVJfUkFESU87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX1ZBUklBQkxFU19CVVRUT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0Rk9GaWxlQmxvY2tfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dEZPRmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9yZWFkaW5nX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRGT0ZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0Rk9GaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3NhdmluZ19jb25maWd1cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNmb3Jtc0Jsb2NrX1BhcmFtZXRlcnNMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zZm9ybXNCbG9ja19TdHlsZXNoZWV0c0xhYmVsOwotCi0Jc3RhdGljCi0JewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWFpblRhYk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vTWFpblRhYk1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL01haW5UYWJNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTEyOWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vTWFpblRhYk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1YU0xNYWluVGFiX0xhYmVsVGV4dD1MaXN0IHN0eWxlc2hlZXRzIGluIHRoZSBvcmRlciB0byBiZSBhcHBsaWVkOgotU3R5bGVzaGVldEVudHJ5TGFiZWxQcm92aWRlcl9JbnZhbGlkX3BhdGg9SW52YWxpZCBwYXRoCi1YU0xNYWluVGFiX1Byb2plY3RfRG9lc19Ob3RfRXhpc3Q9UHJvamVjdCBkb2VzIG5vdCBleGlzdAotWFNMTWFpblRhYl9Qcm9qZWN0X0Nsb3NlZD1Qcm9qZWN0IGlzIGNsb3NlZAotWFNMTWFpblRhYl9Qcm9qZWN0X05hbWVfSW52YWxpZD1Qcm9qZWN0IG5hbWUgaXMgaW52YWxpZAotWFNMTWFpblRhYl9DaG9vc2VfUHJvamVjdF9EaWFsb2dfVGl0bGU9U2VsZWN0IHByb2plY3QKLVhTTE1haW5UYWJfQ2hvb3NlX1Byb2plY3RfRGlhbG9nX01lc3NhZ2U9Q2hvb3NlIGEgcHJvamVjdCB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGxhdW5jaCBjb25maWd1cmF0aW9uCi1YU0xNYWluVGFiX1Byb2plY3RfR3JvdXA9UHJvamVjdAotWFNMTWFpblRhYl9Ccm93c2VfUHJvamVjdHM9QnJvd3NlCi1YU0xNYWluVGFiX1RhYk5hbWU9TWFpbgotCi1UcmFuc2Zvcm1zQmxvY2tfMD1UcmFuc2Zvcm1zQmxvY2sKLVRyYW5zZm9ybXNCbG9ja19OYW1lPVRyYW5zZm9ybWF0aW9uIFBpcGVsaW5lCi1UcmFuc2Zvcm1zQmxvY2tfUGFyYW1ldGVyc0xhYmVsPVBhcmFtZXRlcnMgZm9yIHN0eWxlc2hlZXQ6Ci1UcmFuc2Zvcm1zQmxvY2tfU3R5bGVzaGVldHNMYWJlbD1TdHlsZXNoZWV0czoKLQotSW5wdXRGaWxlQmxvY2tfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ9SW5wdXQgZmlsZSBub3Qgc3BlY2lmaWVkCi1JbnB1dEZpbGVCbG9ja19ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q9SW5wdXQgZmlsZSBkb2VzIG5vdCBleGlzdAotSW5wdXRGaWxlQmxvY2tfR1JPVVBfTkFNRT1YTUwgSW5wdXQgRmlsZQotSW5wdXRGaWxlQmxvY2tfREVGQVVMVF9SQURJTz1Vc2UgZGVmYXVsdAotSW5wdXRGaWxlQmxvY2tfT1RIRVJfUkFESU89T3RoZXIKLUlucHV0RmlsZUJsb2NrX0RJQUxPR19NRVNTQUdFPVNlbGVjdCBhbiBleHRlcm5hbCBpbnB1dCBmaWxlCi1JbnB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U9U2VsZWN0IGFuIGlucHV0IGZpbGUgZnJvbSB0aGUgd29ya3NwYWNlCi1JbnB1dEZpbGVCbG9ja19WQVJJQUJMRVNfQlVUVE9OPVZhcmlhYmxlcy4uLgotSW5wdXRGaWxlQmxvY2tfRklMRV9TWVNURU1fQlVUVE9OPUZpbGUgU3lzdGVtLi4uCi1JbnB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfQlVUVE9OPVdvcmtzcGFjZS4uLgotSW5wdXRGaWxlQmxvY2tfTmFtZT1YTUwgSW5wdXQgRmlsZQotSW5wdXRGaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbj1FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyBjb25maWd1cmF0aW9uCi1JbnB1dEZpbGVCbG9ja19FeGNlcHRpb25fb2NjdXJyZWRfc2F2aW5nX2NvbmZpZ3VyYXRpb249RXhjZXB0aW9uIG9jY3VycmVkIHNhdmluZyBsYXVuY2ggY29uZmlndXJhdGlvbgotSW5wdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRT1GaWxlIFNlbGVjdGlvbgotCi1PdXRwdXRUeXBlQmxvY2tfR3JvdXBfTmFtZT1PdXRwdXQgVHlwZQotT3V0cHV0RmlsZUJsb2NrXzA9VXNlIGRlZmF1bHQgbG9jYXRpb24KLU91dHB1dEZpbGVCbG9ja183PUxvY2F0aW9uOgotT3V0cHV0RmlsZUJsb2NrXzg9T3BlbiBmaWxlIG9uIGNvbXBsZXRpb24KLU91dHB1dEZpbGVCbG9ja185PU91dHB1dCBGaWxlCi1PdXRwdXRGaWxlQmxvY2tfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ9VHJhbnNmb3JtIG91dHB1dCBmaWxlIG5vdCBzcGVjaWZpZWQKLU91dHB1dEZpbGVCbG9ja19ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q9VHJhbnNmb3JtIG91dHB1dCBmaWxlIGRvZXMgbm90IGV4aXN0Ci1PdXRwdXRGaWxlQmxvY2tfR1JPVVBfTkFNRT1UcmFuc2Zvcm0gT3V0cHV0IEZpbGUKLU91dHB1dEZpbGVCbG9ja19ERUZBVUxUX1JBRElPPURlZmF1bHQKLU91dHB1dEZpbGVCbG9ja19PVEhFUl9SQURJTz1PdGhlcgotT3V0cHV0RmlsZUJsb2NrX0RJQUxPR19NRVNTQUdFPVNlbGVjdCBhbiBleHRlcm5hbCBvdXRwdXQgZmlsZQotT3V0cHV0RmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRT1TZWxlY3QgYW4gb3V0cHV0IGZpbGUgZnJvbSB0aGUgd29ya3NwYWNlCi1PdXRwdXRGaWxlQmxvY2tfVkFSSUFCTEVTX0JVVFRPTj1WYXJpYWJsZXMuLi4KLU91dHB1dEZpbGVCbG9ja19GSUxFX1NZU1RFTV9CVVRUT049RmlsZSBTeXN0ZW0uLi4KLU91dHB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfQlVUVE9OPVdvcmtzcGFjZS4uLgotT3V0cHV0RmlsZUJsb2NrX05hbWU9VHJhbnNmb3JtIE91dHB1dCBGaWxlCi1PdXRwdXRGaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3JlYWRpbmdfY29uZmlndXJhdGlvbj1FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyBjb25maWd1cmF0aW9uCi1PdXRwdXRGaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3NhdmluZ19jb25maWd1cmF0aW9uPUV4Y2VwdGlvbiBvY2N1cnJlZCBzYXZpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLU91dHB1dEZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFPUZpbGUgU2VsZWN0aW9uCi0KLU91dHB1dEZPRmlsZUJsb2NrX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEPVJlbmRlcmVyIG91dHB1dCBmaWxlIG5vdCBzcGVjaWZpZWQKLU91dHB1dEZPRmlsZUJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVD1SZW5kZXJlciBvdXRwdXQgZmlsZSBkb2VzIG5vdCBleGlzdAotT3V0cHV0Rk9GaWxlQmxvY2tfR1JPVVBfTkFNRT1SZW5kZXJlciBPdXRwdXQgRmlsZQotT3V0cHV0Rk9GaWxlQmxvY2tfREVGQVVMVF9SQURJTz1EZWZhdWx0Ci1PdXRwdXRGT0ZpbGVCbG9ja19PVEhFUl9SQURJTz1PdGhlcgotT3V0cHV0Rk9GaWxlQmxvY2tfRElBTE9HX01FU1NBR0U9U2VsZWN0IGFuIGV4dGVybmFsIG91dHB1dCBmaWxlCi1PdXRwdXRGT0ZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U9U2VsZWN0IGFuIG91dHB1dCBmaWxlIGZyb20gdGhlIHdvcmtzcGFjZQotT3V0cHV0Rk9GaWxlQmxvY2tfVkFSSUFCTEVTX0JVVFRPTj1WYXJpYWJsZXMuLi4KLU91dHB1dEZPRmlsZUJsb2NrX0ZJTEVfU1lTVEVNX0JVVFRPTj1GaWxlIFN5c3RlbS4uLgotT3V0cHV0Rk9GaWxlQmxvY2tfV09SS1NQQUNFX0JVVFRPTj1Xb3Jrc3BhY2UuLi4KLU91dHB1dEZPRmlsZUJsb2NrX05hbWU9UmVuZGVyZXIgT3V0cHV0IEZpbGUKLU91dHB1dEZPRmlsZUJsb2NrX0V4Y2VwdGlvbl9vY2N1cnJlZF9yZWFkaW5nX2NvbmZpZ3VyYXRpb249RXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgY29uZmlndXJhdGlvbgotT3V0cHV0Rk9GaWxlQmxvY2tfRXhjZXB0aW9uX29jY3VycmVkX3NhdmluZ19jb25maWd1cmF0aW9uPUV4Y2VwdGlvbiBvY2N1cnJlZCBzYXZpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLU91dHB1dEZPRmlsZUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfVElUTEU9RmlsZSBTZWxlY3Rpb24KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDM3YmI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW4ubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vUGFyYW1ldGVyVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE5NGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vUGFyYW1ldGVyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWJzdHJhY3RTdHlsZXNoZWV0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlcgotewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQlwdWJsaWMgUGFyYW1ldGVyVmlld2VyKFRhYmxlIHRhYmxlKQotCXsKLQkJc3VwZXIodGFibGUpOwotCi0JCXRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KQotCQkJewotCQkJCS8vIFRPRE8gLSByZW1vdmFsCi0JCQkJLy8gaWYgKHVwZGF0ZVNlbGVjdGlvbihBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24uUkVNT1ZFLAotCQkJCS8vIChJU3RydWN0dXJlZFNlbGVjdGlvbilnZXRTZWxlY3Rpb24oKSkgJiYgZXZlbnQuY2hhcmFjdGVyID09Ci0JCQkJLy8gU1dULkRFTCAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkKLQkJCQkvLyB7Ci0JCQkJLy8gTGlzdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25Gcm9tV2lkZ2V0KCk7Ci0JCQkJLy8gZ2V0U3R5bGVzaGVldENvbnRlbnRQcm92aWRlcigpLnJlbW92ZUVudHJpZXMoKElTdHlsZXNoZWV0RW50cnlbXSlzZWxlY3Rpb24udG9BcnJheShuZXcKLQkJCQkvLyBJU3R5bGVzaGVldEVudHJ5WzBdKSk7Ci0JCQkJLy8gbm90aWZ5Q2hhbmdlZCgpOwotCQkJCS8vIH0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBQYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyIGdldFBhcmFtZXRlcnNDb250ZW50UHJvdmlkZXIoKQotCXsKLQkJcmV0dXJuIChQYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyKSBzdXBlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKQotCXsKLQkJcmV0dXJuIGdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0JewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oaW50IGFjdGlvblR5cGUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXN3aXRjaCAoYWN0aW9uVHlwZSkKLQkJewotCQkJY2FzZSBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24uQUREOgotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24uUkVNT1ZFOgotCQkJY2FzZSBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24uTU9WRToKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGlvbi5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3RlZEVudHJpZXMoKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoTGF1bmNoQXR0cmlidXRlIHBhcmFtZXRlcikKLQl7Ci0JCWdldFBhcmFtZXRlcnNDb250ZW50UHJvdmlkZXIoKS5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJpZXMoTGF1bmNoQXR0cmlidXRlW10gZW50cmllcykKLQl7Ci0JCWdldFBhcmFtZXRlcnNDb250ZW50UHJvdmlkZXIoKS5yZW1vdmVQYXJhbWV0ZXJzKGVudHJpZXMpOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIExhdW5jaEF0dHJpYnV0ZVtdIGdldFBhcmFtZXRlcnMoKQotCXsKLQkJcmV0dXJuIGdldFBhcmFtZXRlcnNDb250ZW50UHJvdmlkZXIoKS5nZXRQYXJhbWV0ZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lcihJUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXJzQ2hhbmdlZExpc3RlbmVyKElQYXJhbWV0ZXJzQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlDaGFuZ2VkKCkKLQl7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0ZW5lcnMpCi0JCXsKLQkJCSgoSVBhcmFtZXRlcnNDaGFuZ2VkTGlzdGVuZXIpIGVsZW1lbnQpLnBhcmFtZXRlcnNDaGFuZ2VkKHRoaXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlcnNCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9QYXJhbWV0ZXJzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4NDMxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlcnNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuQWJzdHJhY3RUYWJsZUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFic3RyYWN0UGFyYW1ldGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5BZGRQYXJhbWV0ZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLlJlbW92ZVBhcmFtZXRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJzQmxvY2sgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlQmxvY2sKLXsKLQlwcml2YXRlIFBhcmFtZXRlclZpZXdlciBwYXJhbWV0ZXJzVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIGFkZFBhcmFtZXRlckJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVQYXJhbWV0ZXJCdXR0b247Ci0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1zQmxvY2sgdHJhbnNmb3Jtc0Jsb2NrOwotCXByaXZhdGUgZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQl7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQl7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHlsZXNoZWV0U2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzdHlsZXNoZWV0U2VsZWN0aW9uLnNpemUoKSA9PSAxKQotCQkJCXNldFRyYW5zZm9ybSgoTGF1bmNoVHJhbnNmb3JtKSBzdHlsZXNoZWV0U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCWVsc2UKLQkJCQlzZXRUcmFuc2Zvcm0obnVsbCk7Ci0JCQl1cGRhdGVFbmFibGVkKCk7Ci0JCX0KLQl9OwotCXByaXZhdGUgVGFibGUgZlRhYmxlOwotCi0JcHVibGljIFBhcmFtZXRlcnNCbG9jayhUcmFuc2Zvcm1zQmxvY2sgdHJhbnNmb3Jtc0Jsb2NrKQotCXsKLQkJc3VwZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1zQmxvY2sgPSB0cmFuc2Zvcm1zQmxvY2s7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHJhbnNmb3JtKExhdW5jaFRyYW5zZm9ybSB0cmFuc2Zvcm0pCi0JewotCQlwYXJhbWV0ZXJzVmlld2VyLnNldElucHV0KHRyYW5zZm9ybSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW5hYmxlZCgpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHlsZXNoZWV0U2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmFuc2Zvcm1zQmxvY2suZ2V0U3R5bGVzaGVldFZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIGVuYWJsZWQgPSBzdHlsZXNoZWV0U2VsZWN0aW9uLnNpemUoKSA9PSAxOwotCQlwYXJhbWV0ZXJzVmlld2VyLmdldFRhYmxlKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJYWRkUGFyYW1ldGVyQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHBhcmFtZXRlcnNTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHBhcmFtZXRlcnNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCXJlbW92ZVBhcmFtZXRlckJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQgJiYgIXBhcmFtZXRlcnNTZWxlY3Rpb24uaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KGdldE5hbWUoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldEZvbnQoZm9udCk7Ci0KLQkJc2V0Q29udHJvbChncm91cCk7Ci0KLQkJZlRhYmxlID0gbmV3IFRhYmxlKGdyb3VwLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCS8vIGRhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJZlRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZUYWJsZS5zZXRGb250KGZvbnQpOwotCi0JCWZUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlmVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4oZlRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0V2lkdGgoMTUwKTsKLQkJY29sdW1uMS5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBhcmFtZXRlcnNCbG9jay4wIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJLy8gc29ydEJ5TmFtZSgpOwotCQkJfQotCQl9KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKGZUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFdpZHRoKDUwKTsKLQkJY29sdW1uMi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWNvbHVtbjIuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIlBhcmFtZXRlcnNCbG9jay4xIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbHVtbjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJLy8gc29ydEJ5VHlwZSgpOwotCQkJfQotCQl9KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4zID0gbmV3IFRhYmxlQ29sdW1uKGZUYWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4zLnNldFdpZHRoKDE1MCk7Ci0JCWNvbHVtbjMuc2V0UmVzaXphYmxlKHRydWUpOwotCQljb2x1bW4zLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXJhbWV0ZXJzQmxvY2suMiIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2x1bW4zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCS8vIHNvcnRCeVR5cGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcGFyYW1ldGVyc1ZpZXdlciA9IG5ldyBQYXJhbWV0ZXJWaWV3ZXIoZlRhYmxlKTsKLQkJcGFyYW1ldGVyc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQYXJhbWV0ZXJzTGFiZWxQcm92aWRlcigpKTsKLQkJcGFyYW1ldGVyc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFBhcmFtZXRlcnNDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXBhcmFtZXRlcnNWaWV3ZXIuYWRkUGFyYW1ldGVyc0NoYW5nZWRMaXN0ZW5lcihuZXcgSVBhcmFtZXRlcnNDaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHBhcmFtZXRlcnNDaGFuZ2VkKFBhcmFtZXRlclZpZXdlciB2aWV3ZXIpCi0JCQl7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlwYXJhbWV0ZXJzVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdCi0JCXsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXJhbWV0ZXJzQmxvY2suMyIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlBhcmFtZXRlcnNCbG9jay40IiksIE1lc3NhZ2VzLmdldFN0cmluZygiUGFyYW1ldGVyc0Jsb2NrLjUiKSB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJZmluYWwgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW10KLQkJeyBMYXVuY2hBdHRyaWJ1dGUuVFlQRV9TVFJJTkcsIExhdW5jaEF0dHJpYnV0ZS5UWVBFX0JPT0xFQU4sIExhdW5jaEF0dHJpYnV0ZS5UWVBFX0lOVCwgTGF1bmNoQXR0cmlidXRlLlRZUEVfRE9VQkxFLCBMYXVuY2hBdHRyaWJ1dGUuVFlQRV9GTE9BVCwgTGF1bmNoQXR0cmlidXRlLlRZUEVfT0JKRUNULAotCQkJCUxhdW5jaEF0dHJpYnV0ZS5UWVBFX0NMQVNTLCB9OwotCQlDb21ib0JveENlbGxFZGl0b3IgY29tYm9FZGl0b3IgPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKGZUYWJsZSwgdHlwZXMsIFNXVC5SRUFEX09OTFkgfCBTV1QuRFJPUF9ET1dOKTsKLQkJVGV4dENlbGxFZGl0b3IgdGV4dEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcihmVGFibGUpOwotCQlDZWxsRWRpdG9yW10gZWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW10KLQkJeyBudWxsLCBjb21ib0VkaXRvciwgdGV4dEVkaXRvciB9OwotCQlwYXJhbWV0ZXJzVmlld2VyLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotCQlwYXJhbWV0ZXJzVmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpCi0JCXsKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIlBhcmFtZXRlcnNCbG9jay42IikuZXF1YWxzKHByb3BlcnR5KSB8fCBNZXNzYWdlcy5nZXRTdHJpbmcoIlBhcmFtZXRlcnNCbG9jay43IikuZXF1YWxzKHByb3BlcnR5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgZWxlbWVudDsKLQkJCQlpZiAoTWVzc2FnZXMuZ2V0U3RyaW5nKCJQYXJhbWV0ZXJzQmxvY2suOCIpLmVxdWFscyhwcm9wZXJ0eSkpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0JCQkJCXsKLQkJCQkJCVN0cmluZyB0eXBlID0gdHlwZXNbaV07Ci0JCQkJCQlpZiAodHlwZS5lcXVhbHMoYXR0LnR5cGUpKQotCQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcihpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIGF0dC52YWx1ZSA9PSBudWxsID8gIiIgOiBhdHQudmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLQkJCXsKLQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgZWxlbWVudDsKLQkJCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKE1lc3NhZ2VzLmdldFN0cmluZygiUGFyYW1ldGVyc0Jsb2NrLjEwIikuZXF1YWxzKHByb3BlcnR5KSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJSW50ZWdlciB2ID0gKEludGVnZXIpIHZhbHVlOwotCQkJCQlhdHQudHlwZSA9IHR5cGVzW3YuaW50VmFsdWUoKV07Ci0JCQkJfQotCQkJCWVsc2UgaWYgKE1lc3NhZ2VzLmdldFN0cmluZygiUGFyYW1ldGVyc0Jsb2NrLjExIikuZXF1YWxzKHByb3BlcnR5KSkgLy8kTk9OLU5MUy0xJAotCQkJCQlhdHQudmFsdWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQlwYXJhbWV0ZXJzVmlld2VyLnVwZGF0ZShhdHQsIG51bGwpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmFtZXRlckJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgcGFyYW1ldGVyQnV0dG9uQ29tcExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXBhcmFtZXRlckJ1dHRvbkNvbXBMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcGFyYW1ldGVyQnV0dG9uQ29tcExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBhcmFtZXRlckJ1dHRvbkNvbXAuc2V0TGF5b3V0KHBhcmFtZXRlckJ1dHRvbkNvbXBMYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXBhcmFtZXRlckJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhcmFtZXRlckJ1dHRvbkNvbXAuc2V0Rm9udChmb250KTsKLQotCQlhZGRQYXJhbWV0ZXJCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyYW1ldGVyQnV0dG9uQ29tcCwgbmV3IEFkZFBhcmFtZXRlckFjdGlvbihwYXJhbWV0ZXJzVmlld2VyKSk7Ci0JCXJlbW92ZVBhcmFtZXRlckJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJhbWV0ZXJCdXR0b25Db21wLCBuZXcgUmVtb3ZlUGFyYW1ldGVyQWN0aW9uKHBhcmFtZXRlcnNWaWV3ZXIpKTsKLQotCQl0cmFuc2Zvcm1zQmxvY2suZ2V0U3R5bGVzaGVldFZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJcmVzdG9yZUNvbHVtblNldHRpbmdzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhdGhCdXR0b25Db21wLCBBYnN0cmFjdFBhcmFtZXRlckFjdGlvbiBhY3Rpb24pCi0JewotCQlCdXR0b24gYnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgYWN0aW9uLmdldFRleHQoKSwgbnVsbCk7Ci0JCWFjdGlvbi5zZXRCdXR0b24oYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3J0Q29sdW1uKGludCBjb2x1bW4pCi0JewotCQlzd2l0Y2ggKGNvbHVtbikKLQkJewotCQkvLyBjYXNlIDE6Ci0JCS8vIHNvcnRCeU5hbWUoKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgMjoKLQkJLy8gc29ydEJ5VHlwZSgpOwotCQkvLyBicmVhazsKLQkJfQotCQlzdXBlci5zZXRTb3J0Q29sdW1uKGNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRhYmxlIGdldFRhYmxlKCkKLQl7Ci0JCXJldHVybiBmVGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpCi0JewotCQlyZXR1cm4gWFNMRGVidWdVSUNvbnN0YW50cy5NQUlOX1BBUkFNQVRFUlNfQkxPQ0s7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIlBhcmFtZXRlcnNCbG9jay45Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJLy8gaGFuZGxlZCBieSB0aGUgVGFiCi0JCXVwZGF0ZUVuYWJsZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJLy8gaGFuZGxlZCBieSB0aGUgVGFiCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJLy8gaGFuZGxlZCBieSB0aGUgVGFiCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCQlpZiAodHJhbnNmb3Jtc0Jsb2NrLmdldFN0eWxlc2hlZXRWaWV3ZXIoKSAhPSBudWxsKQotCQkJdHJhbnNmb3Jtc0Jsb2NrLmdldFN0eWxlc2hlZXRWaWV3ZXIoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9QYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlcnNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjOGVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlcnNDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLXsKLQlwcml2YXRlIExhdW5jaFRyYW5zZm9ybSBzdHlsZXNoZWV0RW50cnk7Ci0JcHJpdmF0ZSBQYXJhbWV0ZXJWaWV3ZXIgcGFyYW1ldGVyVmlld2VyOwotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JewotCQlpZiAoc3R5bGVzaGVldEVudHJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJcmV0dXJuIHN0eWxlc2hlZXRFbnRyeS5nZXRQYXJhbWV0ZXJzKCkudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQl7Ci0JCXN0eWxlc2hlZXRFbnRyeSA9IChMYXVuY2hUcmFuc2Zvcm0pIG5ld0lucHV0OwotCQlwYXJhbWV0ZXJWaWV3ZXIgPSAoUGFyYW1ldGVyVmlld2VyKSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCX0KLQotCXB1YmxpYyBMYXVuY2hBdHRyaWJ1dGVbXSBnZXRQYXJhbWV0ZXJzKCkKLQl7Ci0JCXJldHVybiAoTGF1bmNoQXR0cmlidXRlW10pIHN0eWxlc2hlZXRFbnRyeS5nZXRQYXJhbWV0ZXJzKCkudG9BcnJheShuZXcgTGF1bmNoQXR0cmlidXRlWzBdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXJzKExhdW5jaEF0dHJpYnV0ZVtdIGVudHJpZXMpCi0JewotCQlmb3IgKExhdW5jaEF0dHJpYnV0ZSBwYXJhbWV0ZXIgOiBlbnRyaWVzKQotCQl7Ci0JCQlzdHlsZXNoZWV0RW50cnkuZ2V0UGFyYW1ldGVycygpLnJlbW92ZShwYXJhbWV0ZXIpOwotCQl9Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gcGFyYW1ldGVyVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQkJTGlzdDxMYXVuY2hBdHRyaWJ1dGU+IGVudHJ5TGlzdCA9IEFycmF5cy5hc0xpc3QoZW50cmllcyk7Ci0JCU9iamVjdCBzZWwgPSBudWxsOwotCQlmb3IgKGludCBpID0gaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0JCXsKLQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlpZiAoIWVudHJ5TGlzdC5jb250YWlucyhpdGVtLmdldERhdGEoKSkpCi0JCQl7Ci0JCQkJc2VsID0gaXRlbS5nZXREYXRhKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcGFyYW1ldGVyVmlld2VyLnJlbW92ZShlbnRyaWVzKTsKLQotCQlpZiAoc2VsICE9IG51bGwpCi0JCQlwYXJhbWV0ZXJWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbCksIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihMYXVuY2hBdHRyaWJ1dGUgcGFyYW1ldGVyKQotCXsKLQkJc3R5bGVzaGVldEVudHJ5LmdldFBhcmFtZXRlcnMoKS5hZGQocGFyYW1ldGVyKTsKLQkJcGFyYW1ldGVyVmlld2VyLmFkZChwYXJhbWV0ZXIpOwotCQlwYXJhbWV0ZXJWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHBhcmFtZXRlciksIHRydWUpOwotCQkvLyBwYXJhbWV0ZXJWaWV3ZXIucmVmcmVzaCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vUGFyYW1ldGVyc0xhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vUGFyYW1ldGVyc0xhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5Y2M5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1BhcmFtZXRlcnNMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJzTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQl7Ci0JCUxhdW5jaEF0dHJpYnV0ZSBwID0gKExhdW5jaEF0dHJpYnV0ZSkgZWxlbWVudDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkKLQkJewotCQkJY2FzZSAwOgotCQkJCXJldHVybiBwLnVyaTsKLQkJCWNhc2UgMToKLQkJCQlyZXR1cm4gcC50eXBlOwotCQkJY2FzZSAyOgotCQkJCXJldHVybiBwLnZhbHVlOwotCQl9Ci0JCXJldHVybiAiISI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1N0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vU3R5bGVzaGVldENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2MzNGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vU3R5bGVzaGVldENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm1haW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hQaXBlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcml2YXRlIExhdW5jaFBpcGVsaW5lIHBpcGVsaW5lOwotCi0JcHVibGljIFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKQotCXsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLQl7Ci0JCXJldHVybiBwaXBlbGluZS5nZXRUcmFuc2Zvcm1EZWZzKCkudG9BcnJheShuZXcgTGF1bmNoVHJhbnNmb3JtWzBdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JewotCQl0YWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCQlwaXBlbGluZSA9IChMYXVuY2hQaXBlbGluZSkgbmV3SW5wdXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudHJpZXMoTGF1bmNoVHJhbnNmb3JtW10gdHJhbnNmb3JtcykKLQl7Ci0JCXBpcGVsaW5lLnNldFRyYW5zZm9ybURlZnMobmV3IEFycmF5TGlzdDxMYXVuY2hUcmFuc2Zvcm0+KEFycmF5cy5hc0xpc3QodHJhbnNmb3JtcykpKTsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVudHJpZXMoTGF1bmNoVHJhbnNmb3JtW10gcmVzLCBPYmplY3QgYmVmb3JlRWxlbWVudCkKLQl7Ci0JCWZvciAoTGF1bmNoVHJhbnNmb3JtIHRyYW5zZm9ybSA6IHJlcykKLQkJewotCQkJcGlwZWxpbmUuYWRkVHJhbnNmb3JtRGVmKHRyYW5zZm9ybSk7Ci0JCX0KLQkJdGFibGVWaWV3ZXIuYWRkKHJlcyk7Ci0JCS8vIHNlbGVjdCB0aGUgZmlyc3QgbmV3IG9uZQotCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzWzBdKSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cmllcyhMYXVuY2hUcmFuc2Zvcm1bXSByZXMpCi0JewotCQlmb3IgKExhdW5jaFRyYW5zZm9ybSB0cmFuc2Zvcm0gOiByZXMpCi0JCXsKLQkJCXBpcGVsaW5lLnJlbW92ZVRyYW5zZm9ybURlZih0cmFuc2Zvcm0pOwotCQl9Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vU3R5bGVzaGVldExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vU3R5bGVzaGVldExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0ZmQ2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1N0eWxlc2hlZXRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBJbWFnZSBpbWFnZSA9IFhTTERlYnVnVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy94c2x0X2xhdW5jaC5naWYiKS5jcmVhdGVJbWFnZSgpOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLQl7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0JewotCQlMYXVuY2hUcmFuc2Zvcm0gbHQgPSAoTGF1bmNoVHJhbnNmb3JtKSBlbGVtZW50OwotCQlpbnQgaW5kZXggPSBsdC5nZXRQaXBlbGluZSgpLmdldFRyYW5zZm9ybURlZnMoKS5pbmRleE9mKGx0KTsKLQotCQlJUGF0aCBwYXRoOwotCQl0cnkKLQkJewotCQkJcGF0aCA9IGx0LmdldFBhdGgoKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWFpblRhYk1lc3NhZ2VzLlN0eWxlc2hlZXRFbnRyeUxhYmVsUHJvdmlkZXJfSW52YWxpZF9wYXRoLCBuZXcgU3RyaW5nW10KLQkJCXsgIm51bGwiIH0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAocGF0aCA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTWFpblRhYk1lc3NhZ2VzLlN0eWxlc2hlZXRFbnRyeUxhYmVsUHJvdmlkZXJfSW52YWxpZF9wYXRoLCBuZXcgU3RyaW5nW10KLQkJCXsgIm51bGwiIH0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoIXBhdGguaXNBYnNvbHV0ZSgpIHx8ICFwYXRoLmlzVmFsaWRQYXRoKHBhdGgudG9TdHJpbmcoKSkpCi0JCXsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNYWluVGFiTWVzc2FnZXMuU3R5bGVzaGVldEVudHJ5TGFiZWxQcm92aWRlcl9JbnZhbGlkX3BhdGgsIG5ldyBTdHJpbmdbXQotCQkJeyBwYXRoLnRvU3RyaW5nKCkgfSk7Ci0JCX0KLQotCQlTdHJpbmdbXSBzZWdtZW50cyA9IHBhdGguc2VnbWVudHMoKTsKLQkJU3RyaW5nQnVmZmVyIGRpc3BsYXlQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoc2VnbWVudHMubGVuZ3RoID4gMCkKLQkJewotCQkJZGlzcGxheVBhdGguYXBwZW5kKHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdKTsKLQkJCWRpc3BsYXlQYXRoLmFwcGVuZCgiIC0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkZXZpY2UgPSBwYXRoLmdldERldmljZSgpOwotCQkJaWYgKGRldmljZSAhPSBudWxsKQotCQkJewotCQkJCWRpc3BsYXlQYXRoLmFwcGVuZChkZXZpY2UpOwotCQkJfQotCQkJZGlzcGxheVBhdGguYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoIC0gMTsgaSsrKQotCQkJewotCQkJCWRpc3BsYXlQYXRoLmFwcGVuZChzZWdtZW50c1tpXSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWRpc3BsYXlQYXRoLmFwcGVuZChwYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiAoaW5kZXggKyAxKSArICIpICIgKyBkaXNwbGF5UGF0aC50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9TdHlsZXNoZWV0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1N0eWxlc2hlZXRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzMGQ2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1N0eWxlc2hlZXRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFic3RyYWN0U3R5bGVzaGVldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoVHJhbnNmb3JtOwotCi1wdWJsaWMgY2xhc3MgU3R5bGVzaGVldFZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCi0JcHVibGljIFN0eWxlc2hlZXRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJZ2V0VGFibGUoKS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkKLQkJCXsKLQkJCQlpZiAodXBkYXRlU2VsZWN0aW9uKEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5SRU1PVkUsIChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpICYmIGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuREVMICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKQotCQkJCXsKLQkJCQkJTGlzdDw/PiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25Gcm9tV2lkZ2V0KCk7Ci0JCQkJCWdldFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKS5yZW1vdmVFbnRyaWVzKChMYXVuY2hUcmFuc2Zvcm1bXSkgc2VsZWN0aW9uLnRvQXJyYXkobmV3IExhdW5jaFRyYW5zZm9ybVswXSkpOwotCQkJCQlub3RpZnlDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIgZ2V0U3R5bGVzaGVldENvbnRlbnRQcm92aWRlcigpCi0JewotCQlyZXR1cm4gKFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIpIHN1cGVyLmdldENvbnRlbnRQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudHJpZXMoTGF1bmNoVHJhbnNmb3JtW10gdHJhbnNmb3JtcykKLQl7Ci0JCWdldFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKS5zZXRFbnRyaWVzKHRyYW5zZm9ybXMpOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIExhdW5jaFRyYW5zZm9ybVtdIGdldEVudHJpZXMoKQotCXsKLQkJcmV0dXJuIChMYXVuY2hUcmFuc2Zvcm1bXSkgZ2V0U3R5bGVzaGVldENvbnRlbnRQcm92aWRlcigpLmdldEVsZW1lbnRzKG51bGwpOwotCX0KLQotCXB1YmxpYyBTaGVsbCBnZXRTaGVsbCgpCi0JewotCQlyZXR1cm4gZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLQl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihpbnQgYWN0aW9uVHlwZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJc3dpdGNoIChhY3Rpb25UeXBlKQotCQl7Ci0JCQljYXNlIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5BREQ6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5SRU1PVkU6Ci0JCQljYXNlIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbi5NT1ZFOgotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gc2VsZWN0aW9uLnNpemUoKSA+IDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGVkRW50cmllcygpCi0JewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFRyYW5zZm9ybXMoTGF1bmNoVHJhbnNmb3JtW10gcmVzKQotCXsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IGJlZm9yZUVsZW1lbnQgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChnZXRFbnRyaWVzKCkubGVuZ3RoID4gMSAmJiBiZWZvcmVFbGVtZW50ID09IG51bGwpCi0JCQliZWZvcmVFbGVtZW50ID0gZ2V0RW50cmllcygpW2dldEVudHJpZXMoKS5sZW5ndGggLSAxXTsKLQkJZ2V0U3R5bGVzaGVldENvbnRlbnRQcm92aWRlcigpLmFkZEVudHJpZXMocmVzLCBiZWZvcmVFbGVtZW50KTsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJpZXMoTGF1bmNoVHJhbnNmb3JtW10gZW50cmllcykKLQl7Ci0JCWdldFN0eWxlc2hlZXRDb250ZW50UHJvdmlkZXIoKS5yZW1vdmVFbnRyaWVzKGVudHJpZXMpOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW50cmllc0NoYW5nZWRMaXN0ZW5lcihJU3R5bGVzaGVldEVudHJpZXNDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyaWVzQ2hhbmdlZExpc3RlbmVyKElTdHlsZXNoZWV0RW50cmllc0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlDaGFuZ2VkKCkKLQl7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IGxpc3RlbmVycykKLQkJewotCQkJKChJU3R5bGVzaGVldEVudHJpZXNDaGFuZ2VkTGlzdGVuZXIpIGVsZW1lbnQpLmVudHJpZXNDaGFuZ2VkKHRoaXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1RyYW5zZm9ybXNCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9UcmFuc2Zvcm1zQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1OGJiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1RyYW5zZm9ybXNCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLkFic3RyYWN0VGFibGVCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5BYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFkZEV4dGVybmFsRmlsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWRkV29ya3NwYWNlRmlsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuTW92ZURvd25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLk1vdmVVcEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuUmVtb3ZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hQaXBlbGluZTsKLQotcHVibGljIGNsYXNzIFRyYW5zZm9ybXNCbG9jayBleHRlbmRzIEFic3RyYWN0VGFibGVCbG9jayBpbXBsZW1lbnRzIElTdHlsZXNoZWV0RW50cmllc0NoYW5nZWRMaXN0ZW5lcgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HU19QUkVGSVggPSBNYWluVGFiTWVzc2FnZXMuVHJhbnNmb3Jtc0Jsb2NrXzA7Ci0JcHJpdmF0ZSBTdHlsZXNoZWV0Vmlld2VyIHN0eWxlc2hlZXRWaWV3ZXI7Ci0JcHJpdmF0ZSBMYXVuY2hQaXBlbGluZSBwaXBlbGluZTsKLQotCXB1YmxpYyBUcmFuc2Zvcm1zQmxvY2soKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KGdldE5hbWUoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldEZvbnQoZm9udCk7Ci0KLQkJc2V0Q29udHJvbChncm91cCk7Ci0KLQkJc3R5bGVzaGVldFZpZXdlciA9IG5ldyBTdHlsZXNoZWV0Vmlld2VyKGdyb3VwKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJc3R5bGVzaGVldFZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZ2QpOwotCQlzdHlsZXNoZWV0Vmlld2VyLmFkZEVudHJpZXNDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXN0eWxlc2hlZXRWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvbnQoZm9udCk7Ci0JCXN0eWxlc2hlZXRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgU3R5bGVzaGVldExhYmVsUHJvdmlkZXIoKSk7Ci0JCXN0eWxlc2hlZXRWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTdHlsZXNoZWV0Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCUNvbXBvc2l0ZSB1cERvd25CdXR0b25Db21wID0gbmV3IENvbXBvc2l0ZShncm91cCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IHVwRG93bkJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXVwRG93bkJ1dHRvbkxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQl1cERvd25CdXR0b25MYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl1cERvd25CdXR0b25Db21wLnNldExheW91dCh1cERvd25CdXR0b25MYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKTsKLQkJdXBEb3duQnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdXBEb3duQnV0dG9uQ29tcC5zZXRGb250KGZvbnQpOwotCi0JCWNyZWF0ZUFycm93QnV0dG9uKHVwRG93bkJ1dHRvbkNvbXAsIG5ldyBNb3ZlVXBBY3Rpb24oc3R5bGVzaGVldFZpZXdlciksIFNXVC5VUCk7Ci0JCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbCh1cERvd25CdXR0b25Db21wLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5OT05FLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpOwotCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNyZWF0ZUFycm93QnV0dG9uKHVwRG93bkJ1dHRvbkNvbXAsIG5ldyBNb3ZlRG93bkFjdGlvbihzdHlsZXNoZWV0Vmlld2VyKSwgU1dULkRPV04pOwotCi0JCUNvbXBvc2l0ZSBwYXRoQnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBwYXRoQnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJcGF0aEJ1dHRvbkxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlwYXRoQnV0dG9uTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcGF0aEJ1dHRvbkNvbXAuc2V0TGF5b3V0KHBhdGhCdXR0b25MYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlwYXRoQnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcGF0aEJ1dHRvbkNvbXAuc2V0Rm9udChmb250KTsKLQotCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBBZGRXb3Jrc3BhY2VGaWxlQWN0aW9uKHN0eWxlc2hlZXRWaWV3ZXIpKTsKLQkJY3JlYXRlQnV0dG9uKHBhdGhCdXR0b25Db21wLCBuZXcgQWRkRXh0ZXJuYWxGaWxlQWN0aW9uKHN0eWxlc2hlZXRWaWV3ZXIsIERJQUxPR19TRVRUSU5HU19QUkVGSVgpKTsKLQkJLy8gVE9ETwotCQkvLyBjcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldwotCQkvLyBTZXRVUklSZXNvbHZlckFjdGlvbihzdHlsZXNoZWV0Vmlld2VyKSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgbmV3IFJlbW92ZUFjdGlvbihzdHlsZXNoZWV0Vmlld2VyKSk7Ci0JfQotCi0JcHVibGljIFZpZXdlciBnZXRTdHlsZXNoZWV0Vmlld2VyKCkKLQl7Ci0JCXJldHVybiBzdHlsZXNoZWV0Vmlld2VyOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQXJyb3dCdXR0b24oQ29tcG9zaXRlIHBhdGhCdXR0b25Db21wLCBBYnN0cmFjdFN0eWxlc2hlZXRBY3Rpb24gYWN0aW9uLCBpbnQgdXBkb3duKQotCXsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHBhdGhCdXR0b25Db21wLCBTV1QuQVJST1cgfCB1cGRvd24pOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQliLnNldExheW91dERhdGEoZ2QpOwotCQlhY3Rpb24uc2V0QnV0dG9uKGIpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGF0aEJ1dHRvbkNvbXAsIEFic3RyYWN0U3R5bGVzaGVldEFjdGlvbiBhY3Rpb24pCi0JewotCQlCdXR0b24gYnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgYWN0aW9uLmdldFRleHQoKSwgbnVsbCk7Ci0JCWFjdGlvbi5zZXRCdXR0b24oYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5UcmFuc2Zvcm1zQmxvY2tfTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQaXBlbGluZShMYXVuY2hQaXBlbGluZSBwaXBlbGluZSkKLQl7Ci0JCXRoaXMucGlwZWxpbmUgPSBwaXBlbGluZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJc3R5bGVzaGVldFZpZXdlci5zZXRJbnB1dChwaXBlbGluZSk7Ci0JCWlmIChwaXBlbGluZS5nZXRUcmFuc2Zvcm1EZWZzKCkuc2l6ZSgpID4gMCkKLQkJewotCQkJc3R5bGVzaGVldFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocGlwZWxpbmUuZ2V0VHJhbnNmb3JtRGVmcygpLmdldCgwKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbnRyaWVzQ2hhbmdlZChTdHlsZXNoZWV0Vmlld2VyIHZpZXdlcikKLQl7Ci0JCXNldERpcnR5KHRydWUpOwotCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0U29ydENvbHVtbihpbnQgY29sdW1uKQotCXsKLQkJc3dpdGNoIChjb2x1bW4pCi0JCXsKLQkJLy8gY2FzZSAxOgotCQkvLyBzb3J0QnlOYW1lKCk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIDI6Ci0JCS8vIHNvcnRCeVR5cGUoKTsKLQkJLy8gYnJlYWs7Ci0JCX0KLQkJc3VwZXIuc2V0U29ydENvbHVtbihjb2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUYWJsZSBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gc3R5bGVzaGVldFZpZXdlciA9PSBudWxsID8gbnVsbCA6IHN0eWxlc2hlZXRWaWV3ZXIuZ2V0VGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJQ29uc3RhbnRzLk1BSU5fVFJBTlNGT1JNU19CTE9DSzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JCWlmIChzdHlsZXNoZWV0Vmlld2VyICE9IG51bGwpCi0JCQlzdHlsZXNoZWV0Vmlld2VyLnJlbW92ZUVudHJpZXNDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL1hTTE1haW5UYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vWFNMTWFpblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjlkMzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL21haW4vWFNMTWFpblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIyMzU1NyAtIEFkZGVkIEltYWdlcyBjb250cmlidXRlZCBieSBIb2xnZXIgVm9vcm1hbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy5pbnRlcm5hbC51dGlsLlhTTERlYnVnUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFBpcGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLXB1YmxpYyBjbGFzcyBYU0xNYWluVGFiIGV4dGVuZHMgWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYgotewotCXByaXZhdGUgZmluYWwgSW5wdXRGaWxlQmxvY2sgaW5wdXRGaWxlQmxvY2s7Ci0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1zQmxvY2sgdHJhbnNmb3Jtc0Jsb2NrOwotCXByaXZhdGUgZmluYWwgUGFyYW1ldGVyc0Jsb2NrIHBhcmFtZXRlcnNCbG9jazsKLQlwdWJsaWMgTGF1bmNoUGlwZWxpbmUgcGlwZWxpbmU7Ci0KLQkvLyBwcml2YXRlIFJlbmRlckJsb2NrIHJlbmRlckJsb2NrOwotCS8vIHByaXZhdGUgT3V0cHV0QmxvY2sgb3V0cHV0QmxvY2s7Ci0KLQlwdWJsaWMgWFNMTWFpblRhYigpCi0JewotCQlJUmVzb3VyY2VbXSByZXNvdXJjZUNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCUlGaWxlIGlucHV0RmlsZSA9IGdldFhNTElucHV0KHJlc291cmNlQ29udGV4dCk7Ci0KLQkJaW5wdXRGaWxlQmxvY2sgPSBuZXcgSW5wdXRGaWxlQmxvY2soaW5wdXRGaWxlKTsKLQkJdHJhbnNmb3Jtc0Jsb2NrID0gbmV3IFRyYW5zZm9ybXNCbG9jaygpOwotCQlwYXJhbWV0ZXJzQmxvY2sgPSBuZXcgUGFyYW1ldGVyc0Jsb2NrKHRyYW5zZm9ybXNCbG9jayk7Ci0JCS8vIHJlbmRlckJsb2NrID0gbmV3IFJlbmRlckJsb2NrKCk7Ci0JCS8vIG91dHB1dEJsb2NrID0gbmV3IE91dHB1dEJsb2NrKCk7Ci0KLQkJc2V0QmxvY2tzKG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdCi0JCXsgaW5wdXRGaWxlQmxvY2ssIHRyYW5zZm9ybXNCbG9jaywgcGFyYW1ldGVyc0Jsb2NrIH0pOyAvLyAscmVuZGVyQmxvY2ssb3V0cHV0QmxvY2t9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCUNvbXBvc2l0ZSBjb21wID0gKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlpbnB1dEZpbGVCbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCQl0cmFuc2Zvcm1zQmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQkJcGFyYW1ldGVyc0Jsb2NrLmNyZWF0ZUNvbnRyb2woY29tcCk7Ci0JCS8vIHJlbmRlckJsb2NrLmNyZWF0ZUNvbnRyb2woY29tcCk7Ci0JCS8vIG91dHB1dEJsb2NrLmNyZWF0ZUNvbnRyb2woY29tcCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJTGF1bmNoUGlwZWxpbmUgbHAgPSBuZXcgTGF1bmNoUGlwZWxpbmUoKTsKLQkJSVJlc291cmNlW10gcmVzb3VyY2VDb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCQlJRmlsZVtdIHN0eWxlc2hlZXRzID0gZ2V0WFNMU3R5bGVzaGVldHMocmVzb3VyY2VDb250ZXh0KTsKLQkJZm9yIChJRmlsZSBmaWxlIDogc3R5bGVzaGVldHMpCi0JCXsKLQkJCUxhdW5jaFRyYW5zZm9ybSBsdCA9IG5ldyBMYXVuY2hUcmFuc2Zvcm0oZmlsZS5nZXRGdWxsUGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKSwgTGF1bmNoVHJhbnNmb3JtLlJFU09VUkNFX1RZUEUpOwotCQkJbHAuYWRkVHJhbnNmb3JtRGVmKGx0KTsKLQkJfQotCQlzYXZlUGlwZWxpbmUoY29uZmlndXJhdGlvbiwgbHApOwotCQlzdXBlci5zZXREZWZhdWx0cyhjb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJcGlwZWxpbmUgPSBudWxsOwotCQl0cnkKLQkJewotCQkJU3RyaW5nIHMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUElQRUxJTkUsIChTdHJpbmcpIG51bGwpOwotCQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzLmdldEJ5dGVzKCkpOwotCQkJCXBpcGVsaW5lID0gTGF1bmNoUGlwZWxpbmUuZnJvbVhNTChpbnB1dFN0cmVhbSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcGlwZWxpbmUgPSBuZXcgTGF1bmNoUGlwZWxpbmUoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQl0cmFuc2Zvcm1zQmxvY2suc2V0UGlwZWxpbmUocGlwZWxpbmUpOwotCQlzdXBlci5pbml0aWFsaXplRnJvbShjb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJc3VwZXIucGVyZm9ybUFwcGx5KGNvbmZpZ3VyYXRpb24pOwotCQlzYXZlUGlwZWxpbmUoY29uZmlndXJhdGlvbiwgcGlwZWxpbmUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlUGlwZWxpbmUoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBMYXVuY2hQaXBlbGluZSBwaXBlbGluZSkKLQl7Ci0JCXRyeQotCQl7Ci0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUElQRUxJTkUsIHBpcGVsaW5lLnRvWE1MKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBNYWluVGFiTWVzc2FnZXMuWFNMTWFpblRhYl9UYWJOYW1lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZVtdIGdldENvbnRleHQoKQotCXsKLQotCQkvLyBJUHJvamVjdFtdIHByb2plY3RzID0KLQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkvLyBwcm9qZWN0LnNldElucHV0KCBwcm9qZWN0cyk7Ci0JCS8vIFN0cmluZyBzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoCi0JCS8vIElYU0xUTGF1bmNoQ29uZmlndXJhdGlvbi5QUk9KRUNULCAiIik7Ci0JCS8vIElQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkvLyBpZiggcy5lcXVhbHMoIiIpKQotCQkvLyB7Ci0JCS8vIGlmKCBwcm9qZWN0cy5sZW5ndGg+MCkKLQkJLy8gewotCQkvLyBwcm9qZWN0ID0gcHJvamVjdHNbIDBdOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gZWxzZQotCQkvLyBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCBzKTsKLQotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gWFNMRGVidWdVSVBsdWdpbi5nZXRBY3RpdmVQYWdlKCk7Ci0JCUxpc3Q8T2JqZWN0PiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJewotCQkJLy8gdXNlIHNlbGVjdGlvbnMgdG8gZmluZCB0aGUgcHJvamVjdAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwYWdlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gc3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCXsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0JCQkJCQlyZXNvdXJjZXMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXR1cm4gKElSZXNvdXJjZVtdKSByZXNvdXJjZXMudG9BcnJheShuZXcgSVJlc291cmNlWzBdKTsKLQkJCX0KLQkJCS8vIHVzZSBjdXJyZW50IGVkaXRvciB0byBmaW5kIHRoZSBwcm9qZWN0Ci0JCQlJRWRpdG9yUGFydCBwYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpCi0JCQl7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gcGFydC5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJCXJldHVybiBuZXcgSVJlc291cmNlW10KLQkJCQkJeyBmaWxlIH07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBJUmVzb3VyY2VbMF07Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRYTUxJbnB1dChJUmVzb3VyY2VbXSBjb250ZXh0KQotCXsKLQkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjb250ZXh0KQotCQl7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSAmJiAoInhtbCIuZXF1YWxzSWdub3JlQ2FzZShyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpIHx8ICJ4aHRtbCIuZXF1YWxzSWdub3JlQ2FzZShyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIChJRmlsZSkgcmVzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZVtdIGdldFhTTFN0eWxlc2hlZXRzKElSZXNvdXJjZVtdIGNvbnRleHQpCi0JewotCQlMaXN0PElSZXNvdXJjZT4gc3R5bGVzaGVldHMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLQkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjb250ZXh0KQotCQl7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSAmJiAieHNsIi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlzdHlsZXNoZWV0cy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiAoSUZpbGVbXSkgc3R5bGVzaGVldHMudG9BcnJheShuZXcgSUZpbGVbMF0pOwotCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIFhTTFBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWFNMRGVidWdQbHVnaW5JbWFnZXMuSU1HX01BSU5fVEFCKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9tYWluL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YTM4ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvbWFpbi9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotUGFyYW1ldGVyc0Jsb2NrLjA9TmFtZQotUGFyYW1ldGVyc0Jsb2NrLjE9VHlwZQotUGFyYW1ldGVyc0Jsb2NrLjEwPXR5cGUKLVBhcmFtZXRlcnNCbG9jay4xMT12YWx1ZQotUGFyYW1ldGVyc0Jsb2NrLjI9VmFsdWUKLVBhcmFtZXRlcnNCbG9jay4zPW5hbWUKLVBhcmFtZXRlcnNCbG9jay40PXR5cGUKLVBhcmFtZXRlcnNCbG9jay41PXZhbHVlCi1QYXJhbWV0ZXJzQmxvY2suNj10eXBlCi1QYXJhbWV0ZXJzQmxvY2suNz12YWx1ZQotUGFyYW1ldGVyc0Jsb2NrLjg9dHlwZQotUGFyYW1ldGVyc0Jsb2NrLjk9VHJhbnNmb3JtYXRpb24gUGFyYW1ldGVycwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvb3V0cHV0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3ZmVkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm91dHB1dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5vdXRwdXQubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0UHJvcGVydGllc0Jsb2NrXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0UHJvcGVydGllc0Jsb2NrXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0UHJvcGVydGllc0Jsb2NrXzEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFByb3BlcnRpZXNCbG9ja18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFByb3BlcnRpZXNCbG9ja180OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFByb3BlcnRpZXNCbG9ja181OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFByb3BlcnRpZXNCbG9ja183OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFByb3BlcnRpZXNCbG9ja184OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFByb3BlcnRpZXNCbG9ja185OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFRhYl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dFRhYl8xOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL291dHB1dC9PdXRwdXRGaWxlQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL291dHB1dC9PdXRwdXRGaWxlQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjNmM0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0RmlsZUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm91dHB1dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlJlc291cmNlU2VsZWN0aW9uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5tYWluLk1haW5UYWJNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0RmlsZUJsb2NrIGV4dGVuZHMgUmVzb3VyY2VTZWxlY3Rpb25CbG9jawotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NRVRIT0RfREVGQVVMVCA9ICI8RGVmYXVsdD4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX01FVEhPRF9YTUwgPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NRVRIT0RfWEhUTUwgPSAieGh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX01FVEhPRF9IVE1MID0gImh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX01FVEhPRF9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9VVFBVVF9NRVRIT0RTID0gbmV3IFN0cmluZ1tdCi0JeyBPVVRQVVRfTUVUSE9EX0RFRkFVTFQsIE9VVFBVVF9NRVRIT0RfWE1MLCBPVVRQVVRfTUVUSE9EX1hIVE1MLCBPVVRQVVRfTUVUSE9EX0hUTUwsIE9VVFBVVF9NRVRIT0RfVEVYVCB9OwotCXByaXZhdGUgQnV0dG9uIG9wZW5GaWxlQ2hlY2tCdXR0b247Ci0JLy8gcHJpdmF0ZSBDb21ib1ZpZXdlciBmb3JtYXRWaWV3ZXI7Ci0JLy8gcHJpdmF0ZSBDb21ibyBmb3JtYXRDb21ibzsKLQlwcml2YXRlIENvbWJvVmlld2VyIG1ldGhvZFZpZXdlcjsKLQlwcml2YXRlIFN0cmluZyBpbnB1dEZpbGVuYW1lOwotCi0JcHVibGljIE91dHB1dEZpbGVCbG9jaygpCi0JewotCQlzdXBlcihJUmVzb3VyY2UuRklMRSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgdHlwZSkKLQl7Ci0JCXN3aXRjaCAodHlwZSkKLQkJewotCQkJY2FzZSBFUlJPUl9ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDoKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLk91dHB1dEZPRmlsZUJsb2NrX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEOwotCQkJY2FzZSBFUlJPUl9ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q6Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGT0ZpbGVCbG9ja19ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q7Ci0JCQljYXNlIEdST1VQX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgVVNFX0RFRkFVTFRfUkFESU86Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGaWxlQmxvY2tfMDsKLQkJCWNhc2UgVVNFX09USEVSX1JBRElPOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuT3V0cHV0Rk9GaWxlQmxvY2tfT1RIRVJfUkFESU87Ci0JCQljYXNlIERJUkVDVE9SWV9ESUFMT0dfTUVTU0FHRToKLQkJCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLk91dHB1dEZPRmlsZUJsb2NrX0RJQUxPR19NRVNTQUdFOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U6Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGT0ZpbGVCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U7Ci0JCQljYXNlIFZBUklBQkxFU19CVVRUT046Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGT0ZpbGVCbG9ja19WQVJJQUJMRVNfQlVUVE9OOwotCQkJY2FzZSBGSUxFX1NZU1RFTV9CVVRUT046Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGT0ZpbGVCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0JCQljYXNlIFdPUktTUEFDRV9CVVRUT046Ci0JCQkJcmV0dXJuIE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGT0ZpbGVCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX1RJVExFOgotCQkJCXJldHVybiBNYWluVGFiTWVzc2FnZXMuT3V0cHV0Rk9GaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQkJfQotCQlyZXR1cm4gIiIgKyB0eXBlOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlKCkKLQl7fQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCS8vIENvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotCQkvLyBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLGZhbHNlKTsKLQkJLy8gZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkvLyBjb21wLnNldExheW91dERhdGEoZ2QpOwotCQkvLyBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsdHJ1ZSk7Ci0JCS8vIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkvLyBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkvLyBjb21wLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZU1ldGhvZENvbWJvKGNvbXApOwotCQkvLyBjcmVhdGVGb3JtYXRDb21ibyhjb21wKTsKLQotCQkvLyBtZXRob2RWaWV3ZXIuc2V0SW5wdXQoIiIpOwotCQkvLyBmb3JtYXRWaWV3ZXIuc2V0SW5wdXQoIiIpOwotCi0JCS8vIG1ldGhvZFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oInhtbCIpLCB0cnVlKTsKLQkJLy8gZm9ybWF0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigiPG5vbmU+IiksIHRydWUpOwotCi0JCWZpbGVMYWJlbCA9IE1haW5UYWJNZXNzYWdlcy5PdXRwdXRGaWxlQmxvY2tfNzsKLQkJY3JlYXRlQ2hlY2tib3hBbmRUZXh0KHBhcmVudCk7Ci0JCWNyZWF0ZUJ1dHRvbnMocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlvcGVuRmlsZUNoZWNrQnV0dG9uID0gY3JlYXRlQ2hlY2tCdXR0b24ocGFyZW50LCBNYWluVGFiTWVzc2FnZXMuT3V0cHV0RmlsZUJsb2NrXzgpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJb3BlbkZpbGVDaGVja0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJb3BlbkZpbGVDaGVja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlidXR0b25Db21wLnNldExheW91dERhdGEoZ2QpOwotCQlidXR0b25Db21wLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJZldvcmtzcGFjZUJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uQ29tcCwgZ2V0TWVzc2FnZShXT1JLU1BBQ0VfQlVUVE9OKSwgbnVsbCk7Ci0JCWZXb3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCi0JCWZGaWxlU3lzdGVtQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihidXR0b25Db21wLCBnZXRNZXNzYWdlKEZJTEVfU1lTVEVNX0JVVFRPTiksIG51bGwpOwotCQlmRmlsZVN5c3RlbUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih3aWRnZXRMaXN0ZW5lcik7Ci0KLQkJZlZhcmlhYmxlc0J1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uQ29tcCwgZ2V0TWVzc2FnZShWQVJJQUJMRVNfQlVUVE9OKSwgbnVsbCk7Ci0JCWZWYXJpYWJsZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWFpblRhYk1lc3NhZ2VzLk91dHB1dEZpbGVCbG9ja185OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCQl0cnkKLQkJewotCQkJLy8gU3RyaW5nIG91dHB1dE1ldGhvZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfTUVUSE9ELCBPVVRQVVRfTUVUSE9EU1swXSk7Ci0JCQkvLyBtZXRob2RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG91dHB1dE1ldGhvZCksCi0JCQkvLyB0cnVlKTsKLQotCQkJaW5wdXRGaWxlbmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFN0cmluZyByZW5kZXJUbyA9Ci0JCQkvLyBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUkVOREVSX1RPLAotCQkJLy8gIiIpOwotCQkJdXBkYXRlRGVmYXVsdE91dHB1dEZpbGUoKTsKLQotCQkJYm9vbGVhbiB1c2VEZWZhdWx0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX09VVFBVVF9GSUxFLCB0cnVlKTsKLQkJCXVzZURlZmF1bHRDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24odXNlRGVmYXVsdCk7Ci0KLQkJCW91dHB1dEZpbGUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1VUUFVUX0ZJTEUsIGRlZmF1bHRPdXRwdXRGaWxlKTsKLQotCQkJdXBkYXRlUmVzb3VyY2VUZXh0KHVzZURlZmF1bHQpOwotCi0JCQlib29sZWFuIG9wZW5GaWxlT25Db21wbGV0aW9uID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09QRU5fRklMRSwgdHJ1ZSk7Ci0JCQlvcGVuRmlsZUNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihvcGVuRmlsZU9uQ29tcGxldGlvbik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJYm9vbGVhbiB1c2VEZWZhdWx0ID0gdXNlRGVmYXVsdENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEUsIHVzZURlZmF1bHQpOwotCi0JCVN0cmluZyBvdXRwdXRGaWxlID0gcmVzb3VyY2VUZXh0LmdldFRleHQoKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9GSUxFLCBvdXRwdXRGaWxlKTsKLQotCQkvLyBTdHJpbmcgb3V0cHV0TWV0aG9kID0KLQkJLy8gKFN0cmluZykoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKW1ldGhvZFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCS8vIG91dHB1dE1ldGhvZCA9IG91dHB1dE1ldGhvZCA9PSBPVVRQVVRfTUVUSE9EU1swXSA/IG51bGwgOgotCQkvLyBvdXRwdXRNZXRob2Q7Ci0JCS8vIGNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfTUVUSE9ELAotCQkvLyBvdXRwdXRNZXRob2QpOwotCi0JCWJvb2xlYW4gb3BlbkZpbGVPbkNvbXBsZXRpb24gPSBvcGVuRmlsZUNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1BFTl9GSUxFLCBvcGVuRmlsZU9uQ29tcGxldGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX09VVFBVVF9GSUxFLCB0cnVlKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9GSUxFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX09VVFBVVF9NRVRIT0QsIChTdHJpbmcpIG51bGwpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1BFTl9GSUxFLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRGVmYXVsdE91dHB1dEZpbGUoKQotCXsKLQkJU3RyaW5nIG1ldGhvZCA9IE9VVFBVVF9NRVRIT0RfWE1MOwotCQlpZiAobWV0aG9kVmlld2VyICE9IG51bGwpCi0JCQltZXRob2QgPSAoU3RyaW5nKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtZXRob2RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoT1VUUFVUX01FVEhPRF9ERUZBVUxULmVxdWFscyhtZXRob2QpKQotCQkJbWV0aG9kID0gT1VUUFVUX01FVEhPRF9YTUw7Ci0KLQkJU3RyaW5nIGZpbGUgPSBpbnB1dEZpbGVuYW1lOwotCQlpbnQgaW5kZXggPSBpbnB1dEZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJCWZpbGUgPSBpbnB1dEZpbGVuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCWZpbGUgKz0gIi5vdXQuIiArIG1ldGhvZDsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXRGaWxlbmFtZS50cmltKCkuZW5kc1dpdGgoIn0iKSkgLy8kTk9OLU5MUy0xJAotCQkJZmlsZSArPSAifSI7IC8vJE5PTi1OTFMtMSQKLQotCQlkZWZhdWx0T3V0cHV0RmlsZSA9IGZpbGU7Ci0KLQkJLy8gdXBkYXRlUmVzb3VyY2VUZXh0KG9wZW5GaWxlQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL291dHB1dC9PdXRwdXRQcm9wZXJ0aWVzQmxvY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL291dHB1dC9PdXRwdXRQcm9wZXJ0aWVzQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjMzQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0UHJvcGVydGllc0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm91dHB1dDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuQWJzdHJhY3RUYWJsZUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5PdXRwdXRQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5YU0xNYWluVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklPdXRwdXRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hQcm9wZXJ0aWVzOwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0UHJvcGVydGllc0Jsb2NrIGV4dGVuZHMgQWJzdHJhY3RUYWJsZUJsb2NrCi17Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRWaWV3ZXI7Ci0JcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uVGV4dDsKLQlwcml2YXRlIElQcm9jZXNzb3JUeXBlIHByb2Nlc3NvclR5cGU7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8SVByb2Nlc3NvclR5cGUsIExhdW5jaFByb3BlcnRpZXM+IHR5cGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8SVByb2Nlc3NvclR5cGUsIExhdW5jaFByb3BlcnRpZXM+KCk7Ci0JcHJpdmF0ZSBCdXR0b24gdXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlc1JhZGlvOwotCXByaXZhdGUgQnV0dG9uIGNoYW5nZVByZWZlcmVuY2VzOwotCXByaXZhdGUgQnV0dG9uIHVzZVNwZWNpZmljUHJvcGVydGllc1JhZGlvOwotCXByaXZhdGUgTGF1bmNoUHJvcGVydGllcyBsYXVuY2hQcm9wZXJ0aWVzOwotCi0JcHVibGljIE91dHB1dFByb3BlcnRpZXNCbG9jayhYU0xNYWluVGFiIG1haW4pCi0JewotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRdWFsaWZpZXIoKQotCXsKLQkJcmV0dXJuIFhTTERlYnVnVUlDb25zdGFudHMuT1VUUFVUX0JMT0NLOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUYWJsZSBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJdXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlc1JhZGlvID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQl1c2VQcm9wZXJ0aWVzRnJvbVByZWZlcmVuY2VzUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVzZVByb3BlcnRpZXNGcm9tUHJlZmVyZW5jZXNSYWRpby5zZXRUZXh0KE1lc3NhZ2VzLk91dHB1dFByb3BlcnRpZXNCbG9ja18wKTsKLQkJdXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlc1JhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJaGFuZGxlVXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlcyh0cnVlKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNoYW5nZVByZWZlcmVuY2VzID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJY2hhbmdlUHJlZmVyZW5jZXMuc2V0VGV4dChNZXNzYWdlcy5PdXRwdXRQcm9wZXJ0aWVzQmxvY2tfMSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJY2hhbmdlUHJlZmVyZW5jZXMuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNoYW5nZVByZWZlcmVuY2VzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCUlQcmVmZXJlbmNlUGFnZSBwYWdlID0gbmV3IE91dHB1dFByZWZlcmVuY2VQYWdlKCk7Ci0JCQkJWFNMRGVidWdVSVBsdWdpbi5zaG93UHJlZmVyZW5jZVBhZ2UoIm9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkub3V0cHV0IiwgcGFnZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVVc2VQcm9wZXJ0aWVzRnJvbVByZWZlcmVuY2VzKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQl1c2VTcGVjaWZpY1Byb3BlcnRpZXNSYWRpbyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJdXNlU3BlY2lmaWNQcm9wZXJ0aWVzUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVzZVNwZWNpZmljUHJvcGVydGllc1JhZGlvLnNldFRleHQoTWVzc2FnZXMuT3V0cHV0UHJvcGVydGllc0Jsb2NrXzMpOwotCQl1c2VTcGVjaWZpY1Byb3BlcnRpZXNSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWhhbmRsZVVzZVByb3BlcnRpZXNGcm9tUHJlZmVyZW5jZXMoZmFsc2UpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gZmlsbGVyCi0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQotCQl0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuVl9TQ1JPTEwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCi0JCXNldENvbnRyb2wodGFibGUpOwotCi0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBjMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljMS5zZXRXaWR0aCgxNTApOwotCQljMS5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWMxLnNldFRleHQoTWVzc2FnZXMuT3V0cHV0UHJvcGVydGllc0Jsb2NrXzQpOwotCi0JCVRhYmxlQ29sdW1uIGMyID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWMyLnNldFdpZHRoKDI1MCk7Ci0JCWMyLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJYzIuc2V0VGV4dChNZXNzYWdlcy5PdXRwdXRQcm9wZXJ0aWVzQmxvY2tfNSk7Ci0KLQkJdFZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIGxhdW5jaFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0KLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpCi0JCXsKLQotCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQkJewotCQkJCVN0cmluZyBwcm9wID0gKFN0cmluZykgZWxlbWVudDsKLQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KQotCQkJCXsKLQkJCQkJY2FzZSAwOgotCQkJCQkJcmV0dXJuIHByb3A7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXJldHVybiBsYXVuY2hQcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3ApOwotCQkJCX0KLQkJCQlyZXR1cm4gIiEhIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotCQkJewotCQkJfQotCi0JCX0pOwotCQl0Vmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdCi0JCXsgTWVzc2FnZXMuT3V0cHV0UHJvcGVydGllc0Jsb2NrXzcsIE1lc3NhZ2VzLk91dHB1dFByb3BlcnRpZXNCbG9ja184IH0pOwotCQl0Vmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpCi0JCXsKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCWlmICghTWVzc2FnZXMuT3V0cHV0UHJvcGVydGllc0Jsb2NrXzkuZXF1YWxzKHByb3BlcnR5KSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJU3RyaW5nIHByb3AgPSAoU3RyaW5nKSBlbGVtZW50OwotCQkJCVN0cmluZyB2YWx1ZSA9IGxhdW5jaFByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcCk7Ci0JCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0JCQl7Ci0JCQkJSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIHByb3AgPSAoU3RyaW5nKSBpdGVtLmdldERhdGEoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpKSAvLyROT04tTkxTLTEkCi0JCQkJCWxhdW5jaFByb3BlcnRpZXMucmVtb3ZlUHJvcGVydHkocHJvcCk7Ci0JCQkJZWxzZQotCQkJCQlsYXVuY2hQcm9wZXJ0aWVzLnNldFByb3BlcnR5KHByb3AsIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl0Vmlld2VyLnVwZGF0ZShwcm9wLCBudWxsKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpCi0JCQl7Ci0JCQkJU3RyaW5nIHByb3AxID0gKFN0cmluZykgZTE7Ci0JCQkJU3RyaW5nIHByb3AyID0gKFN0cmluZykgZTI7Ci0JCQkJcmV0dXJuIHByb3AxLmNvbXBhcmVUbyhwcm9wMik7Ci0JCQl9Ci0JCX0pOwotCQl0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlTdHJpbmcgcHJvcCA9IChTdHJpbmcpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUlQcm9jZXNzb3JUeXBlW10gdHlwZXMgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlcygpOwotCQkJCQlvdXRlcjogZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLQkJCQkJewotCQkJCQkJSVByb2Nlc3NvclR5cGUgcHJvY2Vzc29yVHlwZSA9IHR5cGVzW2ldOwotCQkJCQkJSU91dHB1dFByb3BlcnR5W10gcHJvcGVydHkgPSBwcm9jZXNzb3JUeXBlLmdldE91dHB1dFByb3BlcnRpZXMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydHkubGVuZ3RoOyBqKyspCi0JCQkJCQl7Ci0JCQkJCQkJSU91dHB1dFByb3BlcnR5IG91dHB1dFByb3BlcnR5ID0gcHJvcGVydHlbal07Ci0JCQkJCQkJaWYgKG91dHB1dFByb3BlcnR5LmdldFVSSSgpLmVxdWFscyhwcm9wKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXRleHQgPSBvdXRwdXRQcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotCQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQodGV4dCA9PSBudWxsID8gIiIgOiB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQotCQlUZXh0Q2VsbEVkaXRvciBlZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCi0JCUNlbGxFZGl0b3JbXSBlZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbXQotCQl7IG51bGwsIGVkaXRvciB9OwotCQl0Vmlld2VyLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotCi0JCWRlc2NyaXB0aW9uVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuV1JBUCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuTk9ORSwgdHJ1ZSwgZmFsc2UpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdkLmhlaWdodEhpbnQgPSA1MDsKLQkJZGVzY3JpcHRpb25UZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIG11c3QgY29tZSBhZnRlciBpbnB1dCBoYXMgYmVlbiBzZXQKLQkJcmVzdG9yZUNvbHVtblNldHRpbmdzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVVzZVByb3BlcnRpZXNGcm9tUHJlZmVyZW5jZXMoYm9vbGVhbiBzZWxlY3RlZCkKLQl7Ci0JCWNoYW5nZVByZWZlcmVuY2VzLnNldEVuYWJsZWQoc2VsZWN0ZWQpOwotCQl0YWJsZS5zZXRFbmFibGVkKCFzZWxlY3RlZCk7Ci0KLQkJaWYgKHNlbGVjdGVkKQotCQl7Ci0JCQlsYXVuY2hQcm9wZXJ0aWVzID0gaW5pdGlhbGl6ZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlsYXVuY2hQcm9wZXJ0aWVzID0gKExhdW5jaFByb3BlcnRpZXMpIHR5cGVQcm9wZXJ0aWVzLmdldChwcm9jZXNzb3JUeXBlKTsKLQotCQkJaWYgKGxhdW5jaFByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXsvLyBtYWtlIGEgY29weSBvZiB0aGUgZmVhdHVyZXMgZm9yIHRoZSBwcm9jZXNzb3IgdHlwZQotCQkJCWxhdW5jaFByb3BlcnRpZXMgPSBuZXcgTGF1bmNoUHJvcGVydGllcygpOwotCQkJCXR5cGVQcm9wZXJ0aWVzLnB1dChwcm9jZXNzb3JUeXBlLCBsYXVuY2hQcm9wZXJ0aWVzKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvclR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSU91dHB1dFByb3BlcnR5IHByb3BlcnR5ID0gcHJvY2Vzc29yVHlwZS5nZXRPdXRwdXRQcm9wZXJ0aWVzKClbaV07Ci0JCQkJCWxhdW5jaFByb3BlcnRpZXMuc2V0UHJvcGVydHkocHJvcGVydHkuZ2V0VVJJKCksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0Vmlld2VyLnNldElucHV0KGxhdW5jaFByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWVzc2FnZXMuT3V0cHV0UHJvcGVydGllc0Jsb2NrXzEzOwotCX0KLQotCXByaXZhdGUgTGF1bmNoUHJvcGVydGllcyBpbml0aWFsaXplRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMoKQotCXsKLQkJTGF1bmNoUHJvcGVydGllcyBwcmVmZXJlbmNlcyA9IG5ldyBMYXVuY2hQcm9wZXJ0aWVzKCk7Ci0KLQkJSVByb2Nlc3NvclR5cGUganJlRGVmYXVsdFR5cGUgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlKFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lEKTsKLQkJSU91dHB1dFByb3BlcnR5W10gZmVhdHVyZXMgPSBqcmVEZWZhdWx0VHlwZS5nZXRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0JCU1hcDw/LCA/PiB2YWx1ZXMgPSBqcmVEZWZhdWx0VHlwZS5nZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcygpOwotCQlmb3IgKElPdXRwdXRQcm9wZXJ0eSBmZWF0dXJlIDogZmVhdHVyZXMpCi0JCXsKLQkJCVN0cmluZyBrZXkgPSBmZWF0dXJlLmdldFVSSSgpOwotCQkJcHJlZmVyZW5jZXMuc2V0UHJvcGVydHkoa2V5LCAoU3RyaW5nKSB2YWx1ZXMuZ2V0KGtleSkpOwotCQl9Ci0KLQkJZmVhdHVyZXMgPSBwcm9jZXNzb3JUeXBlLmdldE91dHB1dFByb3BlcnRpZXMoKTsKLQkJdmFsdWVzID0gcHJvY2Vzc29yVHlwZS5nZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcygpOwotCQlmb3IgKElPdXRwdXRQcm9wZXJ0eSBmZWF0dXJlIDogZmVhdHVyZXMpCi0JCXsKLQkJCVN0cmluZyBrZXkgPSBmZWF0dXJlLmdldFVSSSgpOwotCQkJcHJlZmVyZW5jZXMuc2V0UHJvcGVydHkoa2V5LCAoU3RyaW5nKSB2YWx1ZXMuZ2V0KGtleSkpOwotCQl9Ci0KLQkJcmV0dXJuIHByZWZlcmVuY2VzOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmVhdHVyZXNGcm9tU3RvcmFnZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGF1bmNoUHJvcGVydGllcyBsYXVuY2hGZWF0dXJlcyA9IG5ldyBMYXVuY2hQcm9wZXJ0aWVzKCk7Ci0KLQkJSVByb2Nlc3NvclR5cGUganJlRGVmYXVsdFR5cGUgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3JUeXBlKFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lEKTsKLQkJSU91dHB1dFByb3BlcnR5W10gZGVmYXVsdFByb3BzID0ganJlRGVmYXVsdFR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpOwotCQlmb3IgKElPdXRwdXRQcm9wZXJ0eSBmZWF0dXJlIDogZGVmYXVsdFByb3BzKQotCQl7Ci0JCQlTdHJpbmcga2V5ID0gZmVhdHVyZS5nZXRVUkkoKTsKLQkJCWxhdW5jaEZlYXR1cmVzLnNldFByb3BlcnR5KGtleSwgbnVsbCk7Ci0JCX0KLQkJSU91dHB1dFByb3BlcnR5W10gc3BlY2lmaWNQcm9wcyA9IHByb2Nlc3NvclR5cGUuZ2V0T3V0cHV0UHJvcGVydGllcygpOwotCQlmb3IgKElPdXRwdXRQcm9wZXJ0eSBmZWF0dXJlIDogc3BlY2lmaWNQcm9wcykKLQkJewotCQkJU3RyaW5nIGtleSA9IGZlYXR1cmUuZ2V0VVJJKCk7Ci0JCQlsYXVuY2hGZWF0dXJlcy5zZXRQcm9wZXJ0eShrZXksIG51bGwpOwotCQl9Ci0KLQkJU3RyaW5nIHMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1VUUFVUX1BST1BFUlRJRVMsIChTdHJpbmcpIG51bGwpOwotCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQlMYXVuY2hQcm9wZXJ0aWVzIG92ZXJyaWRlRmVhdHVyZXMgPSBMYXVuY2hQcm9wZXJ0aWVzLmZyb21YTUwobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSkpOwotCQkJSU91dHB1dFByb3BlcnR5W10gcHJvcHMgPSBuZXcgSU91dHB1dFByb3BlcnR5W3NwZWNpZmljUHJvcHMubGVuZ3RoICsgZGVmYXVsdFByb3BzLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNwZWNpZmljUHJvcHMsIDAsIHByb3BzLCAwLCBzcGVjaWZpY1Byb3BzLmxlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRlZmF1bHRQcm9wcywgMCwgcHJvcHMsIHNwZWNpZmljUHJvcHMubGVuZ3RoLCBkZWZhdWx0UHJvcHMubGVuZ3RoKTsKLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBvdmVycmlkZUZlYXR1cmVzLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQkJewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbGF1bmNoRmVhdHVyZXMucmVtb3ZlUHJvcGVydHkoa2V5KTsKLQkJCQlmb3IgKElPdXRwdXRQcm9wZXJ0eSBwcm9wIDogcHJvcHMpCi0JCQkJewotCQkJCQlpZiAocHJvcC5nZXRVUkkoKS5lcXVhbHMoa2V5KSkKLQkJCQkJewotCQkJCQkJbGF1bmNoRmVhdHVyZXMuc2V0UHJvcGVydHkoa2V5LCBvdmVycmlkZUZlYXR1cmVzLmdldFByb3BlcnR5KGtleSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl0eXBlUHJvcGVydGllcy5wdXQocHJvY2Vzc29yVHlwZSwgbGF1bmNoRmVhdHVyZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCQl0cnkKLQkJewotCQkJU3RyaW5nIHByb2Nlc3NvcklkID0gbnVsbDsKLQkJCWJvb2xlYW4gdXNlRGVmYXVsdFByb2Nlc3NvciA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1IsIHRydWUpOwotCQkJaWYgKHVzZURlZmF1bHRQcm9jZXNzb3IpCi0JCQkJcHJvY2Vzc29ySWQgPSBYU0xUUnVudGltZS5nZXREZWZhdWx0UHJvY2Vzc29yKCkuZ2V0SWQoKTsKLQkJCWVsc2UKLQkJCQlwcm9jZXNzb3JJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1IsIFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9JRCk7Ci0KLQkJCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3Nvcihwcm9jZXNzb3JJZCk7Ci0JCQlpZiAocHJvY2Vzc29yICE9IG51bGwpCi0JCQkJcHJvY2Vzc29yVHlwZSA9IHByb2Nlc3Nvci5nZXRQcm9jZXNzb3JUeXBlKCk7Ci0JCQllbHNlCi0JCQkJcHJvY2Vzc29yVHlwZSA9IFhTTFRSdW50aW1lLmdldERlZmF1bHRQcm9jZXNzb3IoKS5nZXRQcm9jZXNzb3JUeXBlKCk7Ci0KLQkJCWluaXRpYWxpemVGZWF0dXJlc0Zyb21TdG9yYWdlKGNvbmZpZ3VyYXRpb24pOwotCi0JCQlib29sZWFuIHVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9QUk9QRVJUSUVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOwotCi0JCQl1c2VTcGVjaWZpY1Byb3BlcnRpZXNSYWRpby5zZXRTZWxlY3Rpb24oIXVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKTsKLQkJCXVzZVByb3BlcnRpZXNGcm9tUHJlZmVyZW5jZXNSYWRpby5zZXRTZWxlY3Rpb24odXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMpOwotCQkJaGFuZGxlVXNlUHJvcGVydGllc0Zyb21QcmVmZXJlbmNlcyh1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9QUk9QRVJUSUVTX0ZST01fUFJFRkVSRU5DRVMsIHVzZVByb3BlcnRpZXNGcm9tUHJlZmVyZW5jZXNSYWRpby5nZXRTZWxlY3Rpb24oKSk7Ci0JCVN0cmluZyB4bWw7Ci0JCXRyeQotCQl7Ci0JCQl4bWwgPSBsYXVuY2hQcm9wZXJ0aWVzLnRvWE1MKCk7Ci0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1VUUFVUX1BST1BFUlRJRVMsIHhtbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfUFJPUEVSVElFU19GUk9NX1BSRUZFUkVOQ0VTLCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0VGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvT3V0cHV0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWZlZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvb3V0cHV0L091dHB1dFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLm91dHB1dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLmludGVybmFsLnV0aWwuWFNMRGVidWdQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy5pbnRlcm5hbC51dGlsLlhTTFBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMubWFpbi5YU0xNYWluVGFiOwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0VGFiIGV4dGVuZHMgWFNMTGF1bmNoQ29uZmlndXJhdGlvblRhYgotewotCXByaXZhdGUgZmluYWwgT3V0cHV0UHJvcGVydGllc0Jsb2NrIG91dHB1dEJsb2NrOwotCXByaXZhdGUgZmluYWwgT3V0cHV0RmlsZUJsb2NrIG91dHB1dEZpbGVCbG9jazsKLQotCXB1YmxpYyBPdXRwdXRUYWIoWFNMTWFpblRhYiBtYWluKQotCXsKLQkJb3V0cHV0RmlsZUJsb2NrID0gbmV3IE91dHB1dEZpbGVCbG9jaygpOwotCQlvdXRwdXRCbG9jayA9IG5ldyBPdXRwdXRQcm9wZXJ0aWVzQmxvY2sobWFpbik7Ci0KLQkJc2V0QmxvY2tzKG5ldyBJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdCi0JCXsgb3V0cHV0QmxvY2ssIG91dHB1dEZpbGVCbG9jayB9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCUNvbXBvc2l0ZSBjb21wID0gKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlvdXRwdXRGaWxlQmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wLCBTV1QuTlVMTCk7Ci0JCWdyb3VwLnNldFRleHQoTWVzc2FnZXMuT3V0cHV0VGFiXzApOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlvdXRwdXRCbG9jay5jcmVhdGVDb250cm9sKGdyb3VwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIE1lc3NhZ2VzLk91dHB1dFRhYl8xOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBYU0xQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhTTERlYnVnUGx1Z2luSW1hZ2VzLklNR19PVVRQVVRfVEFCKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9vdXRwdXQvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL291dHB1dC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTFmYmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL291dHB1dC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotT3V0cHV0UHJvcGVydGllc0Jsb2NrXzA9VXNlIHByb3BlcnRpZXMgZnJvbSBwcmVmZXJlbmNlcwotT3V0cHV0UHJvcGVydGllc0Jsb2NrXzE9Q2hhbmdlIFByZWZlcmVuY2VzLi4uCi1PdXRwdXRQcm9wZXJ0aWVzQmxvY2tfMTM9T3V0cHV0IFByb3BlcnRpZXMKLU91dHB1dFByb3BlcnRpZXNCbG9ja18zPVVzZSBzcGVjaWZpYyBwcm9wZXJ0aWVzCi1PdXRwdXRQcm9wZXJ0aWVzQmxvY2tfND1Qcm9wZXJ0eQotT3V0cHV0UHJvcGVydGllc0Jsb2NrXzU9VmFsdWUKLU91dHB1dFByb3BlcnRpZXNCbG9ja183PXByb3BlcnR5Ci1PdXRwdXRQcm9wZXJ0aWVzQmxvY2tfOD12YWx1ZQotT3V0cHV0UHJvcGVydGllc0Jsb2NrXzk9dmFsdWUKLU91dHB1dFRhYl8wPU91dHB1dCBQcm9wZXJ0aWVzCi1PdXRwdXRUYWJfMT1PdXRwdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9GZWF0dXJlc0Jsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvRmVhdHVyZXNCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk4ZGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9GZWF0dXJlc0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuQWJzdHJhY3RUYWJsZUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkuWFNMRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5wcmVmZXJlbmNlcy5GZWF0dXJlc1ByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMVFJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcuTGF1bmNoRmVhdHVyZXM7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlc0Jsb2NrIGV4dGVuZHMgQWJzdHJhY3RUYWJsZUJsb2NrCi17Ci0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRWaWV3ZXI7Ci0JcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uVGV4dDsKLQlwcml2YXRlIElQcm9jZXNzb3JUeXBlIHByb2Nlc3NvclR5cGU7Ci0JcHJpdmF0ZSBCdXR0b24gdXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXNSYWRpbzsKLQlwcml2YXRlIExhdW5jaEZlYXR1cmVzIGxhdW5jaEZlYXR1cmVzOwotCXByaXZhdGUgTGF1bmNoRmVhdHVyZXMgZmVhdHVyZXNGcm9tUHJlZmVyZW5jZXM7Ci0JcHJpdmF0ZSBCdXR0b24gY2hhbmdlUHJlZmVyZW5jZXM7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8SVByb2Nlc3NvclR5cGUsIExhdW5jaEZlYXR1cmVzPiBwcm9jZXNzb3JGZWF0dXJlcyA9IG5ldyBIYXNoTWFwPElQcm9jZXNzb3JUeXBlLCBMYXVuY2hGZWF0dXJlcz4oKTsKLQlwcml2YXRlIEJ1dHRvbiB1c2VTcGVjaWZpY0ZlYXR1cmVzUmFkaW87Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkKLQl7Ci0JCXJldHVybiBYU0xEZWJ1Z1VJQ29uc3RhbnRzLkZFQVRVUkVTX0xBVU5DSF9CTE9DSzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0VGFibGUoKQotCXsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoZ2V0TmFtZSgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ3JvdXAuc2V0Rm9udChmb250KTsKLQotCQlzZXRDb250cm9sKGdyb3VwKTsKLQotCQl1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlc1JhZGlvID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCXVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzUmFkaW8uc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suMCIpKTsgLy8kTk9OLU5MUy0xJAotCQl1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlc1JhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJaGFuZGxlVXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXModHJ1ZSk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQljaGFuZ2VQcmVmZXJlbmNlcyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJY2hhbmdlUHJlZmVyZW5jZXMuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suMSIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWNoYW5nZVByZWZlcmVuY2VzLnNldExheW91dERhdGEoZ2QpOwotCQljaGFuZ2VQcmVmZXJlbmNlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlJUHJlZmVyZW5jZVBhZ2UgcGFnZSA9IG5ldyBGZWF0dXJlc1ByZWZlcmVuY2VQYWdlKCk7Ci0JCQkJWFNMRGVidWdVSVBsdWdpbi5zaG93UHJlZmVyZW5jZVBhZ2UoIm9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkucGFnZTEiLCBwYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIG5vdyByZWZyZXNoIGV2ZXJ5dGhpbmcKLQkJCQloYW5kbGVVc2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyh0cnVlKTsKLQkJCQkvLyB0Vmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdXNlU3BlY2lmaWNGZWF0dXJlc1JhZGlvID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCXVzZVNwZWNpZmljRmVhdHVyZXNSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdXNlU3BlY2lmaWNGZWF0dXJlc1JhZGlvLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJGZWF0dXJlc0Jsb2NrLjMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdXNlU3BlY2lmaWNGZWF0dXJlc1JhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0JCXsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJaGFuZGxlVXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMoZmFsc2UpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gZmlsbGVyCi0JCW5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCi0JCXRhYmxlID0gbmV3IFRhYmxlKGdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlZfU0NST0xMKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ2Qud2lkdGhIaW50ID0gNDUwOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gYzEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJYzEuc2V0V2lkdGgoMTUwKTsKLQkJYzEuc2V0UmVzaXphYmxlKHRydWUpOwotCQljMS5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiRmVhdHVyZXNCbG9jay40IikpOyAvLyROT04tTkxTLTEkCi0KLQkJVGFibGVDb2x1bW4gYzIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJYzIuc2V0V2lkdGgoNTApOwotCQljMi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWMyLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJGZWF0dXJlc0Jsb2NrLjUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlUYWJsZUNvbHVtbiBjMyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljMy5zZXRXaWR0aCgyNTApOwotCQljMy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCWMzLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJGZWF0dXJlc0Jsb2NrLjYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0Vmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkKLQkJewotCi0JCQlwcml2YXRlIFNldDw/PiB0eXBlZEZlYXR1cmVzOwotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLQkJCXsKLQkJCQlyZXR1cm4gdHlwZWRGZWF0dXJlcy50b0FycmF5KG5ldyBMYXVuY2hBdHRyaWJ1dGVbMF0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotCQkJewotCQkJCXR5cGVkRmVhdHVyZXMgPSAoU2V0PD8+KSBuZXdJbnB1dDsKLQkJCX0KLQkJfSk7Ci0JCXRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpCi0JCXsKLQotCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCQkJewotCQkJCUxhdW5jaEF0dHJpYnV0ZSB0diA9IChMYXVuY2hBdHRyaWJ1dGUpIGVsZW1lbnQ7Ci0JCQkJc3dpdGNoIChjb2x1bW5JbmRleCkKLQkJCQl7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiByZW1vdmVVUkkodHYudXJpKTsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcmV0dXJuIHR2LnR5cGU7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCVN0cmluZyB2YWx1ZSA9IHR2LnZhbHVlOwotCQkJCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiAiISEiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIHJlbW92ZVVSSShTdHJpbmcgdXJpKQotCQkJewotCQkJCWludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCXJldHVybiB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJcmV0dXJuIHVyaTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLQkJCXsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCQl7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLQkJCXsKLQkJCX0KLQotCQl9KTsKLQkJdFZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXQotCQl7IE1lc3NhZ2VzLmdldFN0cmluZygiRmVhdHVyZXNCbG9jay45IiksIE1lc3NhZ2VzLmdldFN0cmluZygiRmVhdHVyZXNCbG9jay4xMCIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVzQmxvY2suMTEiKSB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJdFZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IElDZWxsTW9kaWZpZXIoKQotCQl7Ci0JCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJGZWF0dXJlc0Jsb2NrLjEyIikuZXF1YWxzKHByb3BlcnR5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0JCQl7Ci0JCQkJTGF1bmNoQXR0cmlidXRlIHR2ID0gKExhdW5jaEF0dHJpYnV0ZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gdHYudmFsdWUgPT0gbnVsbCA/ICIiIDogdHYudmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLQkJCXsKLQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgZWxlbWVudDsKLQkJCQlMYXVuY2hBdHRyaWJ1dGUgdHYgPSAoTGF1bmNoQXR0cmlidXRlKSBpdGVtLmdldERhdGEoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpKSAvLyROT04tTkxTLTEkCi0JCQkJCWxhdW5jaEZlYXR1cmVzLnJlbW92ZUZlYXR1cmUodHYudXJpKTsKLQkJCQllbHNlCi0JCQkJCXR2LnNldFZhbHVlKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl0Vmlld2VyLnVwZGF0ZSh0diwgbnVsbCk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQkJdFZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKQotCQkJewotCQkJCUxhdW5jaEF0dHJpYnV0ZSBhMSA9IChMYXVuY2hBdHRyaWJ1dGUpIGUxOwotCQkJCUxhdW5jaEF0dHJpYnV0ZSBhMiA9IChMYXVuY2hBdHRyaWJ1dGUpIGUyOwotCQkJCXJldHVybiBhMS51cmkuY29tcGFyZVRvKGEyLnVyaSk7Ci0JCQl9Ci0JCX0pOwotCi0JCVRleHRDZWxsRWRpdG9yIGVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0JCWVkaXRvci5zZXRWYWxpZGF0b3IobmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkKLQkJewotCi0JCQkvLyBUT0RPIHNvcnQgb3V0Ci0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKQotCQkJewotCQkJCXJldHVybiBudWxsOwotCQkJCS8vIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9Ci0JCQkJLy8gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJLy8gVHlwZWRWYWx1ZSB0diA9IChUeXBlZFZhbHVlKXNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkvLwkJCQotCQkJCS8vIElGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCQkJCS8vIElGZWF0dXJlW10gZmVhdHVyZXMgPSBwcm9jZXNzb3JUeXBlLmdldEZlYXR1cmVzKCk7Ci0JCQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykKLQkJCQkvLyB7Ci0JCQkJLy8gSUZlYXR1cmUgZiA9IGZlYXR1cmVzW2ldOwotCQkJCS8vIGlmIChmLmdldFVSSSgpLmVxdWFscyhrZXkpKQotCQkJCS8vIHsKLQkJCQkvLyBmZWF0dXJlID0gZjsKLQkJCQkvLyBicmVhazsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIFN0cmluZyB2YWxpZCA9IG51bGw7Ci0JCQkJLy8gSVN0YXR1cyB2YWxpZFN0YXR1cyA9IGZlYXR1cmUudmFsaWRhdGVWYWx1ZSgoU3RyaW5nKXZhbHVlKTsKLQkJCQkvLyBpZiAodmFsaWRTdGF0dXMgIT0gbnVsbCAmJiB2YWxpZFN0YXR1cy5nZXRTZXZlcml0eSgpID09Ci0JCQkJLy8gSVN0YXR1cy5FUlJPUikKLQkJCQkvLyB7Ci0JCQkJLy8gdmFsaWQgPSB2YWxpZFN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkJLy8gfQotCQkJCS8vIHJldHVybiB2YWxpZDsKLQkJCX0KLQkJfSk7Ci0KLQkJQ2VsbEVkaXRvcltdIGVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltdCi0JCXsgbnVsbCwgbnVsbCwgZWRpdG9yIH07Ci0JCXRWaWV3ZXIuc2V0Q2VsbEVkaXRvcnMoZWRpdG9ycyk7Ci0JCXRWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCUxhdW5jaEF0dHJpYnV0ZSB0diA9IChMYXVuY2hBdHRyaWJ1dGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKHR2ICE9IG51bGwpCi0JCQkJewotCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZXMoKTsKLQkJCQkJZm9yIChJRmVhdHVyZSBmIDogZmVhdHVyZXMpCi0JCQkJCXsKLQkJCQkJCWlmIChmLmdldFVSSSgpLmVxdWFscyh0di51cmkpKQotCQkJCQkJewotCQkJCQkJCWZlYXR1cmUgPSBmOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXRleHQgPSBmZWF0dXJlID09IG51bGwgPyBudWxsIDogZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCX0KLQkJCQlkZXNjcmlwdGlvblRleHQuc2V0VGV4dCh0ZXh0ID09IG51bGwgPyAiIiA6IHRleHQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCi0JCWRlc2NyaXB0aW9uVGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5XUkFQKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ2QuaGVpZ2h0SGludCA9IDUwOwotCQlkZXNjcmlwdGlvblRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcmVzdG9yZUNvbHVtblNldHRpbmdzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKGJvb2xlYW4gc2VsZWN0ZWQpCi0JewotCQljaGFuZ2VQcmVmZXJlbmNlcy5zZXRFbmFibGVkKHNlbGVjdGVkKTsKLQkJdGFibGUuc2V0RW5hYmxlZCghc2VsZWN0ZWQpOwotCi0JCWlmIChzZWxlY3RlZCkKLQkJewotCQkJbGF1bmNoRmVhdHVyZXMgPSBpbml0aWFsaXplRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWxhdW5jaEZlYXR1cmVzID0gKExhdW5jaEZlYXR1cmVzKSBwcm9jZXNzb3JGZWF0dXJlcy5nZXQocHJvY2Vzc29yVHlwZSk7Ci0KLQkJCWlmIChsYXVuY2hGZWF0dXJlcyA9PSBudWxsKQotCQkJey8vIG1ha2UgYSBjb3B5IG9mIHRoZSBmZWF0dXJlcyBmb3IgdGhlIHByb2Nlc3NvciB0eXBlCi0JCQkJbGF1bmNoRmVhdHVyZXMgPSBuZXcgTGF1bmNoRmVhdHVyZXMoKTsKLQkJCQlwcm9jZXNzb3JGZWF0dXJlcy5wdXQocHJvY2Vzc29yVHlwZSwgbGF1bmNoRmVhdHVyZXMpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc29yVHlwZS5nZXRGZWF0dXJlcygpLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZXMoKVtpXTsKLQkJCQkJTGF1bmNoQXR0cmlidXRlIGF0dCA9IG5ldyBMYXVuY2hBdHRyaWJ1dGUoZmVhdHVyZS5nZXRVUkkoKSwgZmVhdHVyZS5nZXRUeXBlKCksIG51bGwpOwotCQkJCQlsYXVuY2hGZWF0dXJlcy5hZGRGZWF0dXJlKGF0dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRWaWV3ZXIuc2V0SW5wdXQobGF1bmNoRmVhdHVyZXMuZ2V0RmVhdHVyZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvY2Vzc29yVHlwZShJUHJvY2Vzc29yVHlwZSBwcm9jZXNzb3JUeXBlKQotCXsKLQkJaWYgKHByb2Nlc3NvclR5cGUgPT0gdGhpcy5wcm9jZXNzb3JUeXBlKQotCQkJcmV0dXJuOwotCi0JCS8vIHRoaXMuZmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMgPSBuZXcgTGF1bmNoRmVhdHVyZXMoKTsKLQkJLy8gSUZlYXR1cmVbXSBmZWF0dXJlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZXMoKTsKLQkJLy8gTWFwIHZhbHVlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZVZhbHVlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkvLyB7Ci0JCS8vIElGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJLy8gZmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMuYWRkRmVhdHVyZShuZXcKLQkJLy8gTGF1bmNoQXR0cmlidXRlKGZlYXR1cmUuZ2V0VVJJKCksZmVhdHVyZS5nZXRUeXBlKCksKFN0cmluZyl2YWx1ZXMuZ2V0KGZlYXR1cmUuZ2V0VVJJKCkpKSk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gaWYgKHRhYmxlICE9IG51bGwpCi0JCS8vIHsKLQkJLy8gaWYgKCF0YWJsZS5nZXRFbmFibGVkKCkpCi0JCS8vIHsKLQkJLy8gbGF1bmNoRmVhdHVyZXMgPSBmZWF0dXJlc0Zyb21QcmVmZXJlbmNlczsKLQkJLy8gfQotCQkvLyBlbHNlCi0JCS8vIHsKLQkJLy8gdGhpcy5sYXVuY2hGZWF0dXJlcyA9IG5ldyBMYXVuY2hGZWF0dXJlcygpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPQotCQkvLyBmZWF0dXJlc0Zyb21QcmVmZXJlbmNlcy5nZXRGZWF0dXJlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJLy8gewotCQkvLyBMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCS8vIGF0dCA9IG5ldyBMYXVuY2hBdHRyaWJ1dGUoYXR0LnVyaSxhdHQudHlwZSxhdHQudmFsdWUpOwotCQkvLyBsYXVuY2hGZWF0dXJlcy5hZGRGZWF0dXJlKGF0dCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB0Vmlld2VyLnNldElucHV0KGxhdW5jaEZlYXR1cmVzLmdldEZlYXR1cmVzKCkpOwotCQkvLyB9Ci0JCXRoaXMucHJvY2Vzc29yVHlwZSA9IHByb2Nlc3NvclR5cGU7Ci0JCWhhbmRsZVVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKHVzZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJGZWF0dXJlc0Jsb2NrLjE2Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0ZFQVRVUkVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOwotCX0KLQotCXByaXZhdGUgTGF1bmNoRmVhdHVyZXMgaW5pdGlhbGl6ZUZlYXR1cmVzRnJvbVByZWZlcmVuY2VzKCkKLQl7Ci0JCUxhdW5jaEZlYXR1cmVzIGZlYXR1cmVzRnJvbVByZWZlcmVuY2VzID0gbmV3IExhdW5jaEZlYXR1cmVzKCk7Ci0KLQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZXMoKTsKLQkJTWFwPD8sID8+IHZhbHVlcyA9IHByb2Nlc3NvclR5cGUuZ2V0RmVhdHVyZVZhbHVlcygpOwotCQlmb3IgKElGZWF0dXJlIGZlYXR1cmUgOiBmZWF0dXJlcykKLQkJewotCQkJZmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMuYWRkRmVhdHVyZShuZXcgTGF1bmNoQXR0cmlidXRlKGZlYXR1cmUuZ2V0VVJJKCksIGZlYXR1cmUuZ2V0VHlwZSgpLCAoU3RyaW5nKSB2YWx1ZXMuZ2V0KGZlYXR1cmUuZ2V0VVJJKCkpKSk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzRnJvbVByZWZlcmVuY2VzOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmVhdHVyZXNGcm9tU3RvcmFnZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGF1bmNoRmVhdHVyZXMgbGF1bmNoRmVhdHVyZXMgPSBuZXcgTGF1bmNoRmVhdHVyZXMoKTsKLQotCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gcHJvY2Vzc29yVHlwZS5nZXRGZWF0dXJlcygpOwotCQlmb3IgKElGZWF0dXJlIGZlYXR1cmUgOiBmZWF0dXJlcykKLQkJewotCQkJbGF1bmNoRmVhdHVyZXMuYWRkRmVhdHVyZShuZXcgTGF1bmNoQXR0cmlidXRlKGZlYXR1cmUuZ2V0VVJJKCksIGZlYXR1cmUuZ2V0VHlwZSgpLCBudWxsKSk7Ci0JCX0KLQotCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9GRUFUVVJFUywgKFN0cmluZykgbnVsbCk7Ci0JCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCUxhdW5jaEZlYXR1cmVzIG92ZXJyaWRlRmVhdHVyZXMgPSBMYXVuY2hGZWF0dXJlcy5mcm9tWE1MKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzLmdldEJ5dGVzKCkpKTsKLQkJCWxhdW5jaEZlYXR1cmVzLmdldEZlYXR1cmVzKCkucmVtb3ZlQWxsKG92ZXJyaWRlRmVhdHVyZXMuZ2V0RmVhdHVyZXMoKSk7Ci0JCQlsYXVuY2hGZWF0dXJlcy5nZXRGZWF0dXJlcygpLmFkZEFsbChvdmVycmlkZUZlYXR1cmVzLmdldEZlYXR1cmVzKCkpOwotCQl9Ci0KLQkJcHJvY2Vzc29yRmVhdHVyZXMucHV0KHByb2Nlc3NvclR5cGUsIGxhdW5jaEZlYXR1cmVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZyBwcm9jZXNzb3JJZCA9IG51bGw7Ci0JCQlib29sZWFuIHVzZURlZmF1bHRQcm9jZXNzb3IgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB0cnVlKTsKLQkJCWlmICh1c2VEZWZhdWx0UHJvY2Vzc29yKQotCQkJCXByb2Nlc3NvcklkID0gWFNMVFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpLmdldElkKCk7Ci0JCQllbHNlCi0JCQkJcHJvY2Vzc29ySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SLCBYU0xUUnVudGltZS5KUkVfREVGQVVMVF9QUk9DRVNTT1JfSUQpOwotCi0JCQlJUHJvY2Vzc29ySW5zdGFsbCBwcm9jZXNzb3IgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3IocHJvY2Vzc29ySWQpOwotCQkJaWYgKHByb2Nlc3NvciAhPSBudWxsKQotCQkJCXByb2Nlc3NvclR5cGUgPSBwcm9jZXNzb3IuZ2V0UHJvY2Vzc29yVHlwZSgpOwotCQkJZWxzZQotCQkJCXByb2Nlc3NvclR5cGUgPSBYU0xUUnVudGltZS5nZXREZWZhdWx0UHJvY2Vzc29yKCkuZ2V0UHJvY2Vzc29yVHlwZSgpOwotCi0JCQlmZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyA9IGluaXRpYWxpemVGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcygpOwotCQkJaW5pdGlhbGl6ZUZlYXR1cmVzRnJvbVN0b3JhZ2UoY29uZmlndXJhdGlvbik7Ci0KLQkJCWJvb2xlYW4gdXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0ZFQVRVUkVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOwotCi0JCQl1c2VTcGVjaWZpY0ZlYXR1cmVzUmFkaW8uc2V0U2VsZWN0aW9uKCF1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyk7Ci0JCQl1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlc1JhZGlvLnNldFNlbGVjdGlvbih1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyk7Ci0JCQloYW5kbGVVc2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyh1c2VGZWF0dXJlc0Zyb21QcmVmZXJlbmNlcyk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQkJYm9vbGVhbiB1c2VEZWZhdWx0ID0gdXNlRmVhdHVyZXNGcm9tUHJlZmVyZW5jZXNSYWRpby5nZXRTZWxlY3Rpb24oKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9GRUFUVVJFU19GUk9NX1BSRUZFUkVOQ0VTLCB1c2VEZWZhdWx0KTsKLQkJdHJ5Ci0JCXsKLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9GRUFUVVJFUywgdXNlRGVmYXVsdCA/IG51bGwgOiBsYXVuY2hGZWF0dXJlcy50b1hNTCgpKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJWFNMRGVidWdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL0luc3RhbGxTdGFuZGluLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvSW5zdGFsbFN0YW5kaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3OGFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvSW5zdGFsbFN0YW5kaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlByb2Nlc3Nvckluc3RhbGw7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsU3RhbmRpbiBleHRlbmRzIFByb2Nlc3Nvckluc3RhbGwKLXsKLQlwdWJsaWMgSW5zdGFsbFN0YW5kaW4oSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCkKLQl7Ci0JCXN1cGVyKGluc3RhbGwuZ2V0SWQoKSwgaW5zdGFsbC5nZXROYW1lKCksIGluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmdldElkKCksIGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpLCBpbnN0YWxsLmdldERlYnVnZ2VyKCkgIT0gbnVsbCA/IGluc3RhbGwuZ2V0RGVidWdnZXIoKS5nZXRJZCgpIDogbnVsbCwgaW5zdGFsbAotCQkJCS5nZXRTdXBwb3J0cygpLCBpbnN0YWxsLmlzQ29udHJpYnV0ZWQoKSk7Ci0JfQotCi0JcHVibGljIEluc3RhbGxTdGFuZGluKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlSWQsIFN0cmluZyBkZWJ1Z2dlcklkLCBJUHJvY2Vzc29ySmFyW10gamFycykKLQl7Ci0JCXN1cGVyKGlkLCBuYW1lLCB0eXBlSWQsIGphcnMsIGRlYnVnZ2VySWQsICIiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvSmFyQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvSmFyQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTFkZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL0phckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci0KLXB1YmxpYyBjbGFzcyBKYXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotewotCXByaXZhdGUgSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbDsKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCXsKLQkJcmV0dXJuIGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JewotCQlpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBuZXdJbnB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvSmFyTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL0phckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4NWQxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvSmFyTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3NvckphcjsKLQotcHVibGljIGNsYXNzIEphckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17Ci0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotCXsKLQkJSVByb2Nlc3NvckphciBqYXIgPSAoSVByb2Nlc3NvckphcikgZWxlbWVudDsKLQkJSVBhdGggcGF0aCA9IGphci5nZXRQYXRoKCk7Ci0JCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCkgKyAiIC0gIiArIHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKSArICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkwMTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODczMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkucHJlZmVyZW5jZXMuUHJvY2Vzc29yc1ByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMVFJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JCbG9jayBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYgotewotCXByaXZhdGUgQnV0dG9uIHVzZVByZWZlcmVuY2VzUmFkaW87Ci0JcHJpdmF0ZSBCdXR0b24gYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBvdmVycmlkZVByZWZlcmVuY2VzUmFkaW87Ci0JcHJpdmF0ZSBDb21ibyBydW5Db21ibzsKLQlwcml2YXRlIEJ1dHRvbiBpbnN0YWxsZWRQcm9jZXNzb3JzQnV0dG9uOwotCXByaXZhdGUgQ29tYm9WaWV3ZXIgcnVuQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBGZWF0dXJlc0Jsb2NrIGZlYXR1cmVzQmxvY2s7Ci0KLQlwdWJsaWMgUHJvY2Vzc29yQmxvY2soRmVhdHVyZXNCbG9jayBmZWF0dXJlc0Jsb2NrKQotCXsKLQkJdGhpcy5mZWF0dXJlc0Jsb2NrID0gZmVhdHVyZXNCbG9jazsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlzZXRDb250cm9sKGdyb3VwKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRGb250KGZvbnQpOwotCQlncm91cC5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckJsb2NrXzApOwotCi0JCXVzZVByZWZlcmVuY2VzUmFkaW8gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQl1c2VQcmVmZXJlbmNlc1JhZGlvLnNldFRleHQoUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yQmxvY2tfMSk7Ci0JCXVzZVByZWZlcmVuY2VzUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJcHJlZmVyZW5jZXNTZWxlY3RlZCgpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbi5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckJsb2NrXzIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkLndpZHRoSGludCA9IDE1MDsKLQkJYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlJUHJlZmVyZW5jZVBhZ2UgcGFnZSA9IG5ldyBQcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UoKTsKLQkJCQlzaG93UHJlZlBhZ2UoIm9yZy5lY2xpcHNlLndzdC54c2x0LmxhdW5jaGluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzb3JQcmVmZXJlbmNlUGFnZSIsIHBhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCi0JCW92ZXJyaWRlUHJlZmVyZW5jZXNSYWRpbyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCW92ZXJyaWRlUHJlZmVyZW5jZXNSYWRpby5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckJsb2NrXzQpOwotCQlvdmVycmlkZVByZWZlcmVuY2VzUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJb3ZlcnJpZGVTZWxlY3RlZCgpOwotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaW5zdGFsbGVkUHJvY2Vzc29yc0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJaW5zdGFsbGVkUHJvY2Vzc29yc0J1dHRvbi5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvcnNDb21ib0Jsb2NrXzEpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkLndpZHRoSGludCA9IDE1MDsKLQkJaW5zdGFsbGVkUHJvY2Vzc29yc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaW5zdGFsbGVkUHJvY2Vzc29yc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQlJUHJlZmVyZW5jZVBhZ2UgcGFnZSA9IG5ldyBQcm9jZXNzb3JzUHJlZmVyZW5jZVBhZ2UoKTsKLQkJCQlzaG93UHJlZlBhZ2UoIm9yZy5lY2xpcHNlLndzdC54c2x0LmxhdW5jaGluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzb3JQcmVmZXJlbmNlUGFnZSIsIHBhZ2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBzZXR0aW5nc0NvbXAgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWdsLm1hcmdpbkhlaWdodCA9IDI7Ci0JCXNldHRpbmdzQ29tcC5zZXRMYXlvdXQoZ2wpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMTU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2V0dGluZ3NDb21wLnNldExheW91dERhdGEoZ2QpOwotCQlzZXR0aW5nc0NvbXAuc2V0Rm9udChmb250KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzZXR0aW5nc0NvbXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JCbG9ja182KTsKLQkJcnVuQ29tYm8gPSBuZXcgQ29tYm8oc2V0dGluZ3NDb21wLCBTV1QuUkVBRF9PTkxZIHwgU1dULlNJTkdMRSk7Ci0JCXJ1bkNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlydW5Db21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihydW5Db21ibyk7Ci0JCXJ1bkNvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29tYm9Db250ZW50UHJvdmlkZXIoKSk7Ci0JCXJ1bkNvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbWJvTGFiZWxQcm92aWRlcigpKTsKLQkJcnVuQ29tYm9WaWV3ZXIuc2V0SW5wdXQoWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29ycygpKTsKLQkJcnVuQ29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLQkJewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJCXsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCWlmICghc2VsLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IChJUHJvY2Vzc29ySW5zdGFsbCkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlmZWF0dXJlc0Jsb2NrLnNldFByb2Nlc3NvclR5cGUocHJvY2Vzc29yLmdldFByb2Nlc3NvclR5cGUoKSk7Ci0JCQkJfQotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZWZlcmVuY2VzU2VsZWN0ZWQoKQotCXsKLQkJYWx0ZXJQcmVmZXJlbmNlc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlpbnN0YWxsZWRQcm9jZXNzb3JzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlydW5Db21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcnVuQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldFJ1blByb2Nlc3NvclByZWZlcmVuY2UoKSksIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdmVycmlkZVNlbGVjdGVkKCkKLQl7Ci0JCWFsdGVyUHJlZmVyZW5jZXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWluc3RhbGxlZFByb2Nlc3NvcnNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcnVuQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd1ByZWZQYWdlKFN0cmluZyBpZCwgSVByZWZlcmVuY2VQYWdlIHBhZ2UpCi0JewotCQlYU0xEZWJ1Z1VJUGx1Z2luLnNob3dQcmVmZXJlbmNlUGFnZShpZCwgcGFnZSk7Ci0JCS8vIG5vdyByZWZyZXNoIGV2ZXJ5dGhpbmcKLQkJcnVuQ29tYm9WaWV3ZXIuc2V0SW5wdXQoWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29ycygpKTsKLQkJcnVuQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldFJ1blByb2Nlc3NvclByZWZlcmVuY2UoKSksIHRydWUpOwotCQkvLyBwcmVmZXJlbmNlc1NlbGVjdGVkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JCbG9ja183OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCQl0cnkKLQkJewotCQkJYm9vbGVhbiB1c2VEZWZhdWx0UHJvY2Vzc29yID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdHJ1ZSk7Ci0JCQlpZiAodXNlRGVmYXVsdFByb2Nlc3NvcikKLQkJCXsKLQkJCQl1c2VQcmVmZXJlbmNlc1JhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlvdmVycmlkZVByZWZlcmVuY2VzUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlwcmVmZXJlbmNlc1NlbGVjdGVkKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdXNlUHJlZmVyZW5jZXNSYWRpby5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCW92ZXJyaWRlUHJlZmVyZW5jZXNSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJb3ZlcnJpZGVTZWxlY3RlZCgpOwotCi0JCQkJSVByb2Nlc3Nvckluc3RhbGwgcnVuSW5zdGFsbCA9IG51bGw7Ci0JCQkJU3RyaW5nIHJ1bklkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUiwgKFN0cmluZykgbnVsbCk7Ci0JCQkJaWYgKHJ1bklkICE9IG51bGwpCi0JCQkJCXJ1bkluc3RhbGwgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3IocnVuSWQpOwotCQkJCWlmIChydW5JbnN0YWxsID09IG51bGwpCi0JCQkJCXJ1bkluc3RhbGwgPSBnZXRSdW5Qcm9jZXNzb3JQcmVmZXJlbmNlKCk7Ci0JCQkJcnVuQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJ1bkluc3RhbGwpKTsKLQotCQkJCS8vIElEZWJ1Z2dlciBkZWJ1Z0luc3RhbGwgPSBudWxsOwotCQkJCS8vIFN0cmluZyBkZWJ1Z0lkID0KLQkJCQkvLyBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SX0ZPUl9ERUJVRywKLQkJCQkvLyAoU3RyaW5nKW51bGwpOwotCQkJCS8vIGlmIChkZWJ1Z0lkICE9IG51bGwpCi0JCQkJLy8gZGVidWdJbnN0YWxsID0gWFNMVFJ1bnRpbWUuZ2V0RGVidWdnZXIoZGVidWdJZCk7Ci0JCQkJLy8gaWYgKGRlYnVnSW5zdGFsbCA9PSBudWxsKQotCQkJCS8vIGRlYnVnSW5zdGFsbCA9IHJ1bkluc3RhbGwuZ2V0RGVidWdnZXIoKTsKLQkJCQkvLyBpZiAoZGVidWdJbnN0YWxsID09IG51bGwpCi0JCQkJLy8gZGVidWdJbnN0YWxsID0gZ2V0RGVidWdQcm9jZXNzb3JQcmVmZXJlbmNlKCk7Ci0JCQkJLy8gZGVidWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3Ci0JCQkJLy8gU3RydWN0dXJlZFNlbGVjdGlvbihkZWJ1Z0luc3RhbGwpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xEZWJ1Z1VJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVByb2Nlc3Nvckluc3RhbGwgZ2V0UnVuUHJvY2Vzc29yUHJlZmVyZW5jZSgpCi0JewotCQlyZXR1cm4gWFNMVFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQlib29sZWFuIHVzZVByZWZlcmVuY2VzID0gdXNlUHJlZmVyZW5jZXNSYWRpby5nZXRTZWxlY3Rpb24oKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUiwgdXNlUHJlZmVyZW5jZXMpOwotCQlpZiAoIXVzZVByZWZlcmVuY2VzKQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbCBydW5wcm9jZXNzb3IgPSAoSVByb2Nlc3Nvckluc3RhbGwpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHJ1bkNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1IsIHJ1bnByb2Nlc3Nvci5nZXRJZCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1IsIHRydWUpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SLCAoU3RyaW5nKSBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENvbWJvQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCQl7Ci0JCQlyZXR1cm4gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29ycygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJewotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb21ib0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotCQl7Ci0JCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBlbGVtZW50OwotCQkJcmV0dXJuIGluc3RhbGwuZ2V0TmFtZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDgzZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3NvckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzb3JEZXNjcmlwdG9yCi17Ci0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yRGV0YWlsc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmE5ZTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yRGV0YWlsc0RpYWxvZyBleHRlbmRzIERpYWxvZwotewotCXByaXZhdGUgZmluYWwgSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbDsKLQotCXB1YmxpYyBQcm9jZXNzb3JEZXRhaWxzRGlhbG9nKFNoZWxsIHNoZWxsLCBJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsKQotCXsKLQkJc3VwZXIoc2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmluc3RhbGwgPSBpbnN0YWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKQotCXsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckRldGFpbHNEaWFsb2dfVGl0bGUpOwotCQkvLyBUT0RPIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBhbmNlc3RvcikKLQl7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGFuY2VzdG9yKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyB0eXBlCi0JCWNyZWF0ZUxhYmVsKHBhcmVudCwgUHJvY2Vzc29yTWVzc2FnZXMuUHJvY2Vzc29yRGV0YWlsc0RpYWxvZ19pbnN0YWxsVHlwZSk7Ci0JCWNyZWF0ZUxhYmVsKHBhcmVudCwgaW5zdGFsbC5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0TGFiZWwoKSk7Ci0KLQkJLy8gbmFtZQotCQljcmVhdGVMYWJlbChwYXJlbnQsIFByb2Nlc3Nvck1lc3NhZ2VzLlByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbE5hbWUpOwotCQljcmVhdGVMYWJlbChwYXJlbnQsIGluc3RhbGwuZ2V0TmFtZSgpKTsKLQotCQkvLyBqYXJzCi0JCUxhYmVsIGxhYmVsID0gY3JlYXRlTGFiZWwocGFyZW50LCBQcm9jZXNzb3JNZXNzYWdlcy5Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxDbGFzc3BhdGgpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlUYWJsZVZpZXdlciBsaWJyYXJ5Vmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSA2OwotCQlsaWJyYXJ5Vmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbGlicmFyeVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEphckNvbnRlbnRQcm92aWRlcigpKTsKLQkJbGlicmFyeVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBKYXJMYWJlbFByb3ZpZGVyKCkpOwotCQlsaWJyYXJ5Vmlld2VyLnNldElucHV0KGluc3RhbGwpOwotCi0JCWFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24gdGhhdCB0aGlzIGRpYWxvZyBzdG9yZXMgaXRzIHNldHRpbmdzIGluCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1NldHRpbmdzU2VjdGlvbk5hbWUoKQotCXsKLQkJcmV0dXJuICJYU0xfREVUQUlMU19ESUFMT0dfU0VDVElPTiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ0JvdW5kc1NldHRpbmdzKCkKLQl7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IFhTTERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gc2V0dGluZ3MuZ2V0U2VjdGlvbihnZXREaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKCkpOwotCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotCQl7Ci0JCQlzZWN0aW9uID0gc2V0dGluZ3MuYWRkTmV3U2VjdGlvbihnZXREaWFsb2dTZXR0aW5nc1NlY3Rpb25OYW1lKCkpOwotCQl9Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCS8vIGNyZWF0ZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYnkgZGVmYXVsdAotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9Qcm9jZXNzb3JNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDUwZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9jZXNzb3JNZXNzYWdlcyBleHRlbmRzIE5MUwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yLlByb2Nlc3Nvck1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yQmxvY2tfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckJsb2NrXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JCbG9ja18yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yQmxvY2tfNDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckJsb2NrXzY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JCbG9ja183OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yc0NvbWJvQmxvY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yc0NvbWJvQmxvY2tfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JzQ29tYm9CbG9ja18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNwZWNpZmljUHJvY2Vzc29yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5wdXRGaWxlQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfNTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja182OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfODsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckRldGFpbHNEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxOYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yRGV0YWlsc0RpYWxvZ19pbnN0YWxsVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckRldGFpbHNEaWFsb2dfaW5zdGFsbENsYXNzcGF0aDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ18xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvY2Vzc29yRGlhbG9nXzc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfRWRpdF9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19BZGRfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfamFyczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19mZWF0dXJlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JOYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvY2Vzc29yRGlhbG9nX3Byb2Nlc3NvclR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfNjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckxpYnJhcnlCbG9ja19BZGRCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfUmVtb3ZlQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yTGlicmFyeUJsb2NrX0FkZFdvcmtzcGFjZUJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19lbnRlck5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9jZXNzb3JEaWFsb2dfZHVwbGljYXRlTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2Nlc3NvckRpYWxvZ19Qcm9jZXNzb3JfbmFtZV9tdXN0X2JlX2FfdmFsaWRfZmlsZV9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc29yTGlicmFyeUJsb2NrX0ZpbGVEaWFsb2dfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JMaWJyYXJ5QmxvY2tfV29ya3NwYWNlRmlsZURpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NvckxpYnJhcnlCbG9ja19Xb3Jrc3BhY2VGaWxlRGlhbG9nX01lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzb3JzVXBkYXRlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja18xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2luZ0RpcmVjdG9yeUJsb2NrXzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19ERUZBVUxUX1JBRElPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19PVEhFUl9SQURJTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfRElBTE9HX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2luZ0RpcmVjdG9yeUJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfVkFSSUFCTEVTX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JraW5nRGlyZWN0b3J5QmxvY2tfRklMRV9TWVNURU1fQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja18zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja181OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja182OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja184OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX0RFRkFVTFRfUkFESU87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja19PVEhFUl9SQURJTzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSVJlc29sdmVyQmxvY2tfVkFSSUFCTEVTX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX0ZJTEVfU1lTVEVNX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUklSZXNvbHZlckJsb2NrX1dPUktTUEFDRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJUmVzb2x2ZXJCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFOwotCi0Jc3RhdGljCi0JewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHJvY2Vzc29yTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1Byb2Nlc3Nvck1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNjdiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvUHJvY2Vzc29yTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLVByb2Nlc3NvckJsb2NrXzA9WFNMVCBQcm9jZXNzb3IKLVByb2Nlc3NvckJsb2NrXzE9VXNlIHByb2Nlc3NvciBmcm9tIHByZWZlcmVuY2VzCi1Qcm9jZXNzb3JCbG9ja18yPUNoYW5nZSBwcmVmZXJlbmNlcy4uLgotUHJvY2Vzc29yQmxvY2tfND1Vc2Ugc3BlY2lmaWMgcHJvY2Vzc29yCi1Qcm9jZXNzb3JCbG9ja182PVByb2Nlc3NvcjoKLVByb2Nlc3NvckJsb2NrXzc9UHJvY2Vzc29yCi1Qcm9jZXNzb3JzQ29tYm9CbG9jaz1YU0xUIFByb2Nlc3NvcgotUHJvY2Vzc29yc0NvbWJvQmxvY2tfMD1ObyBYU0xUIHByb2Nlc3NvcnMgZGVmaW5lZCBpbiB3b3Jrc3BhY2UKLVByb2Nlc3NvcnNDb21ib0Jsb2NrXzE9Jkluc3RhbGxlZCBwcm9jZXNzb3JzLi4uCi1TcGVjaWZpY1Byb2Nlc3Nvcj1BbHRlcm5hdGUgUHJvY2Vzc29yOgotCi1VUklSZXNvbHZlckJsb2NrX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEPVVSSSBSZXNvbHZlciBkaXJlY3Rvcnkgbm90IHNwZWNpZmllZAotVVJJUmVzb2x2ZXJCbG9ja19ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q9VVJJIFJlc29sdmVyIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAotVVJJUmVzb2x2ZXJCbG9ja19ERUZBVUxUX1JBRElPPURlZmF1bHQgKHJlc29sdmUgVVJJcyByZWxhdGl2ZSB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkpCi1VUklSZXNvbHZlckJsb2NrX09USEVSX1JBRElPPU90aGVyCi1VUklSZXNvbHZlckJsb2NrX0RJQUxPR19NRVNTQUdFPVNlbGVjdCBhbiBleHRlcm5hbCBVUkkgcmVzb2x2ZXIgZGlyZWN0b3J5Ci1VUklSZXNvbHZlckJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRT1TZWxlY3QgYSBVUkkgcmVzb2x2ZXIgZGlyZWN0b3J5IGluIHRoZSB3b3Jrc3BhY2UKLVVSSVJlc29sdmVyQmxvY2tfVkFSSUFCTEVTX0JVVFRPTj1WYXJpYWJsZXMuLi4KLVVSSVJlc29sdmVyQmxvY2tfRklMRV9TWVNURU1fQlVUVE9OPUZpbGUgU3lzdGVtLi4uCi1VUklSZXNvbHZlckJsb2NrX1dPUktTUEFDRV9CVVRUT049V29ya3NwYWNlLi4uCi1VUklSZXNvbHZlckJsb2NrX1dPUktTUEFDRV9ESUFMT0dfVElUTEU9Rm9sZGVyIFNlbGVjdGlvbgotCi0KLVVSSVJlc29sdmVyQmxvY2tfMD1Xb3Jrc3BhY2UKLVVSSVJlc29sdmVyQmxvY2tfMT1GaWxlIFN5c3RlbQotVVJJUmVzb2x2ZXJCbG9ja18xNz1WYXJpYWJsZXMKLVVSSVJlc29sdmVyQmxvY2tfNz1TZWxlY3QgYSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi1VUklSZXNvbHZlckJsb2NrXzQ9U2VsZWN0IGEgd29ya3NwYWNlIHJlbGF0aXZlIGJhc2UgZGlyZWN0b3J5Ci1VUklSZXNvbHZlckJsb2NrXzE5PU90aGVyOgotVVJJUmVzb2x2ZXJCbG9ja18xOD1EZWZhdWx0Ci1VUklSZXNvbHZlckJsb2NrXzEyPUJhc2UgZGlyZWN0b3J5IGZvciByZXNvbHZpbmcgVVJJcwotVVJJUmVzb2x2ZXJCbG9ja18xMD1CYXNlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAotVVJJUmVzb2x2ZXJCbG9ja18yMD1CYXNlIGRpcmVjdG9yeSBub3Qgc3BlY2lmaWVkCi1VUklSZXNvbHZlckJsb2NrXzM9VVJJIFJlc29sdmVyCi1VUklSZXNvbHZlckJsb2NrXzU9UmVsYXRpdmUgdG8gd29ya2luZyBkaXJlY3RvcnkKLVVSSVJlc29sdmVyQmxvY2tfNj1SZWxhdGl2ZSB0byAoMXN0KSBzdHlsZXNoZWV0Ci1VUklSZXNvbHZlckJsb2NrXzg9U3BlY2lmaWMgTG9jYXRpb246Ci1VUklSZXNvbHZlckJsb2NrX1dvcmtpbmdfRGlyZWN0b3J5Xzg9VVJJIFJlc29sdmVyCi1VUklSZXNvbHZlckJsb2NrX1dPUktTUEFDRV9ESUFMT0dfVElUTEU9Rm9sZGVyIFNlbGVjdGlvbgotCi1Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nX1RpdGxlPUJ1aWx0LWluIFhTTFQgUHJvY2Vzc29yCi1Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxOYW1lPU5hbWU6Ci1Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxUeXBlPVR5cGU6Ci1Qcm9jZXNzb3JEZXRhaWxzRGlhbG9nX2luc3RhbGxDbGFzc3BhdGg9TGlicmFyaWVzOgotCi1BZGRQcm9jZXNzb3JEaWFsb2dfMT1TdXBwb3J0ZWQgdmVyc2lvbnM6Ci1BZGRQcm9jZXNzb3JEaWFsb2dfNz1Qcm9jZXNzb3IgbXVzdCBzdXBwb3J0IGF0IGxlYXN0IG9uZSBYU0xUIHZlcnNpb24KLUFkZFByb2Nlc3NvckRpYWxvZ19FZGl0X1RpdGxlPUVkaXQgUHJvY2Vzc29yCi1BZGRQcm9jZXNzb3JEaWFsb2dfQWRkX1RpdGxlPUFkZCBQcm9jZXNzb3IKLUFkZFByb2Nlc3NvckRpYWxvZ19wcm9jZXNzb3JOYW1lPVByb2Nlc3NvciBOYW1lOgotQWRkUHJvY2Vzc29yRGlhbG9nX3Byb2Nlc3NvclR5cGU9UHJvY2Vzc29yIFR5cGU6Ci1BZGRQcm9jZXNzb3JEaWFsb2dfamFycz1MaWJyYXJpZXM6Ci1BZGRQcm9jZXNzb3JEaWFsb2dfZmVhdHVyZXM9RmVhdHVyZXM6Ci1BZGRQcm9jZXNzb3JEaWFsb2dfZW50ZXJOYW1lPUEgbmFtZSBtdXN0IGJlIGVudGVyZWQgZm9yIHRoaXMgcHJvY2Vzc29yCi1BZGRQcm9jZXNzb3JEaWFsb2dfZHVwbGljYXRlTmFtZT1UaGUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQKLUFkZFByb2Nlc3NvckRpYWxvZ19Qcm9jZXNzb3JfbmFtZV9tdXN0X2JlX2FfdmFsaWRfZmlsZV9uYW1lPVByb2Nlc3NvciBuYW1lIG11c3QgYmUgYSB2YWxpZCBmaWxlIG5hbWUKLUluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18wPUluc3RhbGxlZCBKYXZhIFhTTFQgUHJvY2Vzc29yczoKLUluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18xPU5hbWUKLUluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18yPVR5cGUKLUluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja18zPVhTTFQgVmVyc2lvbnMKLUluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja180PURlYnVnZ2VyCi1JbnN0YWxsZWRQcm9jZXNzb3JzQmxvY2tfNT1BZGQKLUluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja182PUVkaXQKLUluc3RhbGxlZFByb2Nlc3NvcnNCbG9ja183PVJlbW92ZQotSW5zdGFsbGVkUHJvY2Vzc29yc0Jsb2NrXzg9Tm9uZQotCi1Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfNj1PbmUgb3IgbW9yZSBqYXIgZmlsZXMgbXVzdCBiZSBzcGVjaWZpZWQKLVByb2Nlc3NvckxpYnJhcnlCbG9ja19BZGRCdXR0b249QWRkIEV4dGVybmFsIEpBUnMKLVByb2Nlc3NvckxpYnJhcnlCbG9ja19BZGRXb3Jrc3BhY2VCdXR0b249QWRkIFdvcmtzcGFjZSBKQVJzCi1Qcm9jZXNzb3JMaWJyYXJ5QmxvY2tfUmVtb3ZlQnV0dG9uPVJlbW92ZQotUHJvY2Vzc29yTGlicmFyeUJsb2NrX0ZpbGVEaWFsb2dfVGl0bGU9RXh0ZXJuYWwgSkFScwotUHJvY2Vzc29yTGlicmFyeUJsb2NrX1dvcmtzcGFjZUZpbGVEaWFsb2dfVGl0bGU9V29ya3NwYWNlIEpBUnMKLVByb2Nlc3NvckxpYnJhcnlCbG9ja19Xb3Jrc3BhY2VGaWxlRGlhbG9nX01lc3NhZ2U9U2VsZWN0IHRoZSBKQVJzIHRoYXQgbWFrZSB1cCB0aGUgWFNMVCBwcm9jZXNzb3IKLQotUHJvY2Vzc29yc1VwZGF0ZXI9U2F2ZSBwcm9jZXNzb3Igc2V0dGluZ3MKLQotCi1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfMT1EZWZhdWx0OgotV29ya2luZ0RpcmVjdG9yeUJsb2NrXzI9T3RoZXI6Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfMz1Xb3JraW5nIERpcmVjdG9yeQotV29ya2luZ0RpcmVjdG9yeUJsb2NrX0RJUkVDVE9SWV9OT1RfU1BFQ0lGSUVEPVdvcmtpbmcgZGlyZWN0b3J5IG5vdCBzcGVjaWZpZWQKLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19ESVJFQ1RPUllfRE9FU19OT1RfRVhJU1Q9V29ya2luZyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19ERUZBVUxUX1JBRElPPVdvcmtzcGFjZSBkZWZhdWx0Ci1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfT1RIRVJfUkFESU89T3RoZXIKLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19ESUFMT0dfTUVTU0FHRT1TZWxlY3QgYW4gZXh0ZXJuYWwgd29ya2luZyBkaXJlY3RvcnkKLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U9U2VsZWN0IGEgd29ya2luZyBkaXJlY3RvcnkgaW4gdGhlIHdvcmtzcGFjZQotV29ya2luZ0RpcmVjdG9yeUJsb2NrX1ZBUklBQkxFU19CVVRUT049VmFyaWFibGVzLi4uCi1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfRklMRV9TWVNURU1fQlVUVE9OPUZpbGUgU3lzdGVtLi4uCi1Xb3JraW5nRGlyZWN0b3J5QmxvY2tfV09SS1NQQUNFX0JVVFRPTj1Xb3Jrc3BhY2UuLi4KLVdvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfRElBTE9HX1RJVExFPUZvbGRlciBTZWxlY3Rpb24KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvWFNMUHJvY2Vzc29yVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9wcm9jZXNzb3IvWFNMUHJvY2Vzc29yVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzQxMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL1hTTFByb2Nlc3NvclRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gYnVnIDIyMzU1NyAtIEFkZGVkIGltYWdlcyBjb250cmlidXRlZCBieSBIb2xnZXIgVm9vcm1hbm4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy5pbnRlcm5hbC51dGlsLlhTTERlYnVnUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWcuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlhTTERlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnZva2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMVFJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBYU0xQcm9jZXNzb3JUYWIgZXh0ZW5kcyBYU0xMYXVuY2hDb25maWd1cmF0aW9uVGFiCi17Ci0JcHJpdmF0ZSBmaW5hbCBQcm9jZXNzb3JCbG9jayBwcm9jZXNzb3JCbG9jazsKLQkvLyBwcml2YXRlIFdvcmtpbmdEaXJlY3RvcnlCbG9jayB3b3JraW5nRGlyZWN0b3J5QmxvY2s7Ci0JLy8gcHJpdmF0ZSBVUklSZXNvbHZlckJsb2NrMiBmZWF0dXJlc0Jsb2NrOwotCXByaXZhdGUgZmluYWwgRmVhdHVyZXNCbG9jayBmZWF0dXJlc0Jsb2NrOwotCi0JcHVibGljIFhTTFByb2Nlc3NvclRhYigpCi0JewotCQlmZWF0dXJlc0Jsb2NrID0gbmV3IEZlYXR1cmVzQmxvY2soKTsKLQkJcHJvY2Vzc29yQmxvY2sgPSBuZXcgUHJvY2Vzc29yQmxvY2soZmVhdHVyZXNCbG9jayk7Ci0JCXNldEJsb2NrcyhuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXQotCQl7IHByb2Nlc3NvckJsb2NrLCBmZWF0dXJlc0Jsb2NrIH0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBnZXRDb250cm9sKCk7Ci0KLQkJcHJvY2Vzc29yQmxvY2suY3JlYXRlQ29udHJvbChjb21wKTsKLQkJZmVhdHVyZXNCbG9jay5jcmVhdGVDb250cm9sKGNvbXApOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQlzdXBlci5wZXJmb3JtQXBwbHkoY29uZmlndXJhdGlvbik7Ci0JCS8vIFRPRE8gbWFrZSBhIG5ldyBibG9jayB0byBhbGxvdyB1c2VyIHRvIHNlbGVjdCB0aGUgaW52b2tlcgotCQlJUHJvY2Vzc29ySW52b2tlciBpbnZva2VyID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29ySW52b2tlcnMoKVswXTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JTlZPS0VSX0RFU0NSSVBUT1IsIGludm9rZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTFByb2Nlc3NvclRhYi4wIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotCXsKLQkJcmV0dXJuIFhTTFBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWFNMRGVidWdQbHVnaW5JbWFnZXMuSU1HX1BST0NFU1NPUl9UQUIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Byb2Nlc3Nvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDIwYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcHJvY2Vzc29yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1GZWF0dXJlc0Jsb2NrLjA9VXNlIGZlYXR1cmVzIGZyb20gcHJlZmVyZW5jZXMKLUZlYXR1cmVzQmxvY2suMT1DaGFuZ2UgUHJlZmVyZW5jZXMuLi4KLUZlYXR1cmVzQmxvY2suMTA9dHlwZQotRmVhdHVyZXNCbG9jay4xMT12YWx1ZQotRmVhdHVyZXNCbG9jay4xMj12YWx1ZQotRmVhdHVyZXNCbG9jay4xNj1Qcm9jZXNzb3IgRmVhdHVyZXMKLUZlYXR1cmVzQmxvY2suMz1Vc2Ugc3BlY2lmaWMgZmVhdHVyZXMKLUZlYXR1cmVzQmxvY2suND1GZWF0dXJlCi1GZWF0dXJlc0Jsb2NrLjU9VHlwZQotRmVhdHVyZXNCbG9jay42PVZhbHVlCi1GZWF0dXJlc0Jsb2NrLjk9bmFtZQotWFNMUHJvY2Vzc29yVGFiLjA9UHJvY2Vzc29yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9yZXNvbHZlci9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0ZTAxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9yZXNvbHZlci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLnRhYnMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnJlc29sdmVyLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9yZXNvbHZlci9VUklSZXNvbHZlckJsb2NrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9yZXNvbHZlci9VUklSZXNvbHZlckJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MGJlYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5SZXNvdXJjZVNlbGVjdGlvbkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuUHJvY2Vzc29yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyQmxvY2sgZXh0ZW5kcyBSZXNvdXJjZVNlbGVjdGlvbkJsb2NrCi17Ci0JcHJpdmF0ZSBCdXR0b24gc3R5bGVzaGVldFJlbGF0aXZlUmFkaW87Ci0JcHJpdmF0ZSBCdXR0b24gb3RoZXJSYWRpbzsKLQlwcml2YXRlIEJ1dHRvbiB3b3JraW5nRGlyUmVsYXRpdmVSYWRpbzsKLQotCXB1YmxpYyBVUklSZXNvbHZlckJsb2NrKCkKLQl7Ci0JCXN1cGVyKElSZXNvdXJjZS5GT0xERVIsIHRydWUsIHRydWUsIHRydWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgdHlwZSkKLQl7Ci0JCXN3aXRjaCAodHlwZSkKLQkJewotCQkJY2FzZSBFUlJPUl9ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDoKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuVVJJUmVzb2x2ZXJCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQkJCWNhc2UgRVJST1JfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5VUklSZXNvbHZlckJsb2NrX0RJUkVDVE9SWV9ET0VTX05PVF9FWElTVDsKLQkJCWNhc2UgR1JPVVBfTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBVU0VfREVGQVVMVF9SQURJTzoKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuVVJJUmVzb2x2ZXJCbG9ja19ERUZBVUxUX1JBRElPOwotCQkJY2FzZSBVU0VfT1RIRVJfUkFESU86Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLlVSSVJlc29sdmVyQmxvY2tfT1RIRVJfUkFESU87Ci0JCQljYXNlIERJUkVDVE9SWV9ESUFMT0dfTUVTU0FHRToKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuVVJJUmVzb2x2ZXJCbG9ja19ESUFMT0dfTUVTU0FHRTsKLQkJCWNhc2UgV09SS1NQQUNFX0RJQUxPR19NRVNTQUdFOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5VUklSZXNvbHZlckJsb2NrX1dPUktTUEFDRV9ESUFMT0dfTUVTU0FHRTsKLQkJCWNhc2UgVkFSSUFCTEVTX0JVVFRPTjoKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuVVJJUmVzb2x2ZXJCbG9ja19WQVJJQUJMRVNfQlVUVE9OOwotCQkJY2FzZSBGSUxFX1NZU1RFTV9CVVRUT046Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLlVSSVJlc29sdmVyQmxvY2tfRklMRV9TWVNURU1fQlVUVE9OOwotCQkJY2FzZSBXT1JLU1BBQ0VfQlVUVE9OOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5VUklSZXNvbHZlckJsb2NrX1dPUktTUEFDRV9CVVRUT047Ci0JCQljYXNlIFdPUktTUEFDRV9ESUFMT0dfVElUTEU6Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLlVSSVJlc29sdmVyQmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQkJfQotCQlyZXR1cm4gIiIgKyB0eXBlOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlKCkKLQl7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5VUklSZXNvbHZlckJsb2NrXzM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hlY2tib3hBbmRUZXh0KENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQl1c2VEZWZhdWx0Q2hlY2tCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihwYXJlbnQsIGdldE1lc3NhZ2UoVVNFX0RFRkFVTFRfUkFESU8pKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXVzZURlZmF1bHRDaGVja0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdXNlRGVmYXVsdENoZWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHdpZGdldExpc3RlbmVyKTsKLQotCQlDb21wb3NpdGUgc3BlY2lmaWNGaWxlQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDU7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlzcGVjaWZpY0ZpbGVDb21wLnNldExheW91dChsYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNwZWNpZmljRmlsZUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCXVwZGF0ZUVuYWJsZW1lbnQodXNlRGVmYXVsdENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfTsKLQotCQl3b3JraW5nRGlyUmVsYXRpdmVSYWRpbyA9IGNyZWF0ZVJhZGlvQnV0dG9uKHNwZWNpZmljRmlsZUNvbXAsIFByb2Nlc3Nvck1lc3NhZ2VzLlVSSVJlc29sdmVyQmxvY2tfNSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJd29ya2luZ0RpclJlbGF0aXZlUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXdvcmtpbmdEaXJSZWxhdGl2ZVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlzdHlsZXNoZWV0UmVsYXRpdmVSYWRpbyA9IGNyZWF0ZVJhZGlvQnV0dG9uKHNwZWNpZmljRmlsZUNvbXAsIFByb2Nlc3Nvck1lc3NhZ2VzLlVSSVJlc29sdmVyQmxvY2tfNik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3R5bGVzaGVldFJlbGF0aXZlUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXN0eWxlc2hlZXRSZWxhdGl2ZVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlvdGhlclJhZGlvID0gY3JlYXRlUmFkaW9CdXR0b24oc3BlY2lmaWNGaWxlQ29tcCwgUHJvY2Vzc29yTWVzc2FnZXMuVVJJUmVzb2x2ZXJCbG9ja184KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlvdGhlclJhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQlvdGhlclJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXNvdXJjZVRleHQgPSBuZXcgVGV4dChzcGVjaWZpY0ZpbGVDb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJcmVzb3VyY2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXNvdXJjZVRleHQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJcmVzb3VyY2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHdpZGdldExpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZXNvdXJjZVRleHQoYm9vbGVhbiB1c2VEZWZhdWx0KQotCXsKLQkJaWYgKHVzZURlZmF1bHQpCi0JCXsKLQkJCXJlc291cmNlVGV4dC5zZXRUZXh0KGRlZmF1bHRPdXRwdXRGaWxlID09IG51bGwgPyAiIiA6IGRlZmF1bHRPdXRwdXRGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmVzb3VyY2VUZXh0LnNldFRleHQob3V0cHV0RmlsZSA9PSBudWxsID8gIiIgOiBvdXRwdXRGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXVwZGF0ZUVuYWJsZW1lbnQodXNlRGVmYXVsdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW5hYmxlbWVudChib29sZWFuIHVzZURlZmF1bHQpCi0JewotCQlvdGhlclJhZGlvLnNldEVuYWJsZWQoIXVzZURlZmF1bHQpOwotCQlzdHlsZXNoZWV0UmVsYXRpdmVSYWRpby5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJd29ya2luZ0RpclJlbGF0aXZlUmFkaW8uc2V0RW5hYmxlZCghdXNlRGVmYXVsdCk7Ci0KLQkJYm9vbGVhbiBvdGhlckVuYWJsZWQgPSAhdXNlRGVmYXVsdCAmJiBvdGhlclJhZGlvLmdldFNlbGVjdGlvbigpOwotCQlyZXNvdXJjZVRleHQuc2V0RW5hYmxlZChvdGhlckVuYWJsZWQpOwotCQlmRmlsZVN5c3RlbUJ1dHRvbi5zZXRFbmFibGVkKG90aGVyRW5hYmxlZCk7Ci0JCWZWYXJpYWJsZXNCdXR0b24uc2V0RW5hYmxlZChvdGhlckVuYWJsZWQpOwotCQlmV29ya3NwYWNlQnV0dG9uLnNldEVuYWJsZWQob3RoZXJFbmFibGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLS8vCQlpZiAod29ya2luZ0RpclJlbGF0aXZlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpCi0vLwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CQVNFX1VSSV9UWVBFLCBYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkJBU0VfVVJJX1dPUktJTkdfRElSX1JFTEFUSVZFKTsKLS8vCQllbHNlIGlmIChzdHlsZXNoZWV0UmVsYXRpdmVSYWRpby5nZXRTZWxlY3Rpb24oKSkKLS8vCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0JBU0VfVVJJX1RZUEUsIFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQkFTRV9VUklfU1RZTEVTSEVFVF9SRUxBVElWRSk7Ci0vLwkJZWxzZSBpZiAob3RoZXJSYWRpby5nZXRTZWxlY3Rpb24oKSkKLS8vCQl7Ci0vLwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CQVNFX1VSSV9UWVBFLCBYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkJBU0VfVVJJX0FCU09MVVRFKTsKLS8vCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0JBU0VfVVJJX0RJUkVDVE9SWSwgZ2V0VGV4dCgpKTsKLS8vCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcpCi0JewotCQljb25maWcuc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9CQVNFX1VSSV9ESVJFQ1RPUlksIChTdHJpbmcpIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Jlc29sdmVyL1VSSVJlc29sdmVyQmxvY2syLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuZGVidWcudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvZGVidWcvdWkvdGFicy9yZXNvbHZlci9VUklSZXNvbHZlckJsb2NrMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Y4YzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Jlc29sdmVyL1VSSVJlc29sdmVyQmxvY2syLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlckJsb2NrMiBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYgotewotCXByaXZhdGUgQnV0dG9uIGN1c3RvbVJhZGlvOwotCXByaXZhdGUgVGV4dCBjdXN0b21UZXh0OwotCXByaXZhdGUgZmluYWwgUmVzb2x2ZXJUeXBlW10gcmVzb2x2ZXJUeXBlcyA9IG5ldyBSZXNvbHZlclR5cGVbXQotCXsgbmV3IFJlc29sdmVyVHlwZShNZXNzYWdlcy5nZXRTdHJpbmcoIlVSSVJlc29sdmVyQmxvY2syLjAiKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJVUklSZXNvbHZlckJsb2NrMi4xIikpLCBuZXcgUmVzb2x2ZXJUeXBlKCJvcmcuZWNsaXBzZS53c3Quc29tZS5yZXNvbHZlci50eXBlLjEiLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlVSSVJlc29sdmVyQmxvY2syLjMiKSkgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCXByaXZhdGUgQnV0dG9uIGRlZmF1bHRSYWRpbzsKLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChnZXROYW1lKCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRGb250KGZvbnQpOwotCi0JCXNldENvbnRyb2woZ3JvdXApOwotCi0JCWRlZmF1bHRSYWRpbyA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWRlZmF1bHRSYWRpby5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiVVJJUmVzb2x2ZXJCbG9jazIuNCIpKTsgLy8kTk9OLU5MUy0xJAotCQlkZWZhdWx0UmFkaW8uc2V0Rm9udChmb250KTsKLQkJZGVmYXVsdFJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWN1c3RvbVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJY29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJQ29tYm9WaWV3ZXIgY1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0JCWNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpCi0JCXsKLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc29sdmVyVHlwZXM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQkJewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JCQl7Ci0JCQl9Ci0JCX0pOwotCQljVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLQkJCXsKLQkJCQlSZXNvbHZlclR5cGUgdHlwZSA9IChSZXNvbHZlclR5cGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCWNWaWV3ZXIuc2V0SW5wdXQocmVzb2x2ZXJUeXBlcyk7Ci0JCWNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc29sdmVyVHlwZXNbMF0pKTsKLQkJY1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCQkJewotCQkJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3VzdG9tUmFkaW8gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQljdXN0b21SYWRpby5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiVVJJUmVzb2x2ZXJCbG9jazIuNSIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljdXN0b21SYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljdXN0b21SYWRpby5zZXRGb250KGZvbnQpOwotCQljdXN0b21SYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLQkJCXsKLQkJCQljdXN0b21UZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJY29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgdGV4dENvbXAgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQl0ZXh0Q29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQl0ZXh0Q29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGV4dENvbXAuc2V0Rm9udChmb250KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0ZXh0Q29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiVVJJUmVzb2x2ZXJCbG9jazIuNiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWN1c3RvbVRleHQgPSBuZXcgVGV4dCh0ZXh0Q29tcCwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWN1c3RvbVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWN1c3RvbVRleHQuc2V0Rm9udChmb250KTsKLQkJY3VzdG9tVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKQotCQl7Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLQkJCXsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJVUklSZXNvbHZlckJsb2NrMi43Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZykKLQl7Ci0JCVN0cmluZyB0ZXh0ID0gY3VzdG9tVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChjdXN0b21SYWRpby5nZXRTZWxlY3Rpb24oKSAmJiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkpCi0JCXsKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5nZXRTdHJpbmcoIlVSSVJlc29sdmVyQmxvY2syLjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNWYWxpZChsYXVuY2hDb25maWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JewotCi0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKQotCXsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNvbHZlclR5cGUKLQl7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkJcHVibGljIFJlc29sdmVyVHlwZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pCi0JCXsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotCQl7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JCXsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Jlc29sdmVyL1dvcmtpbmdEaXJlY3RvcnlCbG9jay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvV29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYzcyMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvV29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS50YWJzLnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5JU3RyaW5nVmFyaWFibGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmRlYnVnLnVpLlJlc291cmNlU2VsZWN0aW9uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5kZWJ1Zy51aS5YU0xEZWJ1Z1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwuZGVidWcudWkudGFicy5wcm9jZXNzb3IuUHJvY2Vzc29yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFdvcmtpbmdEaXJlY3RvcnlCbG9jayBleHRlbmRzIFJlc291cmNlU2VsZWN0aW9uQmxvY2sKLXsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0V29ya2luZ0RpcjsKLQlwcml2YXRlIFRleHQgZGVmYXVsdFRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gdXNlU3BlY2lmaWNCdXR0b247Ci0KLQlwdWJsaWMgV29ya2luZ0RpcmVjdG9yeUJsb2NrKCkKLQl7Ci0JCXN1cGVyKElSZXNvdXJjZS5GT0xERVIsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1lc3NhZ2UoaW50IHR5cGUpCi0JewotCQlzd2l0Y2ggKHR5cGUpCi0JCXsKLQkJCWNhc2UgRVJST1JfRElSRUNUT1JZX05PVF9TUEVDSUZJRUQ6Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19ESVJFQ1RPUllfTk9UX1NQRUNJRklFRDsKLQkJCWNhc2UgRVJST1JfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfRElSRUNUT1JZX0RPRVNfTk9UX0VYSVNUOwotCQkJY2FzZSBHUk9VUF9OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFVTRV9ERUZBVUxUX1JBRElPOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfREVGQVVMVF9SQURJTzsKLQkJCWNhc2UgVVNFX09USEVSX1JBRElPOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfT1RIRVJfUkFESU87Ci0JCQljYXNlIERJUkVDVE9SWV9ESUFMT0dfTUVTU0FHRToKLQkJCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuV29ya2luZ0RpcmVjdG9yeUJsb2NrX0RJQUxPR19NRVNTQUdFOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U6Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfRElBTE9HX01FU1NBR0U7Ci0JCQljYXNlIFZBUklBQkxFU19CVVRUT046Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19WQVJJQUJMRVNfQlVUVE9OOwotCQkJY2FzZSBGSUxFX1NZU1RFTV9CVVRUT046Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19GSUxFX1NZU1RFTV9CVVRUT047Ci0JCQljYXNlIFdPUktTUEFDRV9CVVRUT046Ci0JCQkJcmV0dXJuIFByb2Nlc3Nvck1lc3NhZ2VzLldvcmtpbmdEaXJlY3RvcnlCbG9ja19XT1JLU1BBQ0VfQlVUVE9OOwotCQkJY2FzZSBXT1JLU1BBQ0VfRElBTE9HX1RJVExFOgotCQkJCXJldHVybiBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfV09SS1NQQUNFX0RJQUxPR19USVRMRTsKLQkJfQotCQlyZXR1cm4gIiIgKyB0eXBlOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hlY2tib3hBbmRUZXh0KENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlDb21wb3NpdGUgc3BlY2lmaWNGaWxlQ29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlzcGVjaWZpY0ZpbGVDb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNwZWNpZmljRmlsZUNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdXNlRGVmYXVsdENoZWNrQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oc3BlY2lmaWNGaWxlQ29tcCwgUHJvY2Vzc29yTWVzc2FnZXMuV29ya2luZ0RpcmVjdG9yeUJsb2NrXzEpOwotCQl1c2VEZWZhdWx0Q2hlY2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCi0JCWRlZmF1bHRUZXh0ID0gbmV3IFRleHQoc3BlY2lmaWNGaWxlQ29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkZWZhdWx0VGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZGVmYXVsdFRleHQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJZGVmYXVsdFRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJdXNlU3BlY2lmaWNCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihzcGVjaWZpY0ZpbGVDb21wLCBQcm9jZXNzb3JNZXNzYWdlcy5Xb3JraW5nRGlyZWN0b3J5QmxvY2tfMik7Ci0KLQkJcmVzb3VyY2VUZXh0ID0gbmV3IFRleHQoc3BlY2lmaWNGaWxlQ29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZXNvdXJjZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJlc291cmNlVGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlyZXNvdXJjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIod2lkZ2V0TGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZXNvdXJjZSgpCi0JewotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gUHJvY2Vzc29yTWVzc2FnZXMuV29ya2luZ0RpcmVjdG9yeUJsb2NrXzM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCXRyeQotCQl7Ci0JCQlzZXRMYXVuY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOwotCi0JCQl1cGRhdGVEZWZhdWx0V29ya2luZ0RpcigpOwotCi0JCQlvdXRwdXRGaWxlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0NFU1NPUl9XT1JLSU5HX0RJUiwgKFN0cmluZykgbnVsbCk7Ci0JCQlib29sZWFuIHVzZURlZmF1bHQgPSBvdXRwdXRGaWxlID09IG51bGw7Ci0KLQkJCXVzZURlZmF1bHRDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24odXNlRGVmYXVsdCk7Ci0JCQl1c2VTcGVjaWZpY0J1dHRvbi5zZXRTZWxlY3Rpb24oIXVzZURlZmF1bHQpOwotCQkJcmVzb3VyY2VUZXh0LnNldEVuYWJsZWQoIXVzZURlZmF1bHQpOwotCi0JCQlpZiAodXNlRGVmYXVsdCkKLQkJCQlvdXRwdXRGaWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJdXBkYXRlUmVzb3VyY2VUZXh0KHVzZURlZmF1bHQpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVhTTERlYnVnVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb3VyY2VUZXh0KGJvb2xlYW4gdXNlRGVmYXVsdCkKLQl7Ci0JCXN1cGVyLnVwZGF0ZVJlc291cmNlVGV4dCh1c2VEZWZhdWx0KTsKLQkJZGVmYXVsdFRleHQuc2V0VGV4dChkZWZhdWx0V29ya2luZ0Rpcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRGVmYXVsdFdvcmtpbmdEaXIoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCXsKLQkJCQlTdHJpbmcgcGF0aEV4cHIgPSBjb25maWcuZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9JTlBVVF9GSUxFLCAoU3RyaW5nKSBudWxsKTsKLQkJCQlpZiAocGF0aEV4cHIgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUlQYXRoIHBhdGggPSBnZXRQYXRoKHBhdGhFeHByKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJCQkJZGVmYXVsdFdvcmtpbmdEaXIgPSBwYXRoLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLQkJewotCQl9Ci0JCWRlZmF1bHRXb3JraW5nRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBQYXRoIGdldFBhdGgoU3RyaW5nIGlucHV0RmlsZSkKLQl7Ci0JCVBhdGggcGF0aCA9IG51bGw7Ci0JCWlmIChpbnB1dEZpbGUuaW5kZXhPZigiJHsiKSA+PSAwKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUlTdHJpbmdWYXJpYWJsZU1hbmFnZXIgbWFuYWdlciA9IFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCk7Ci0JCQl0cnkKLQkJCXsKLQkJCQltYW5hZ2VyLnZhbGlkYXRlU3RyaW5nVmFyaWFibGVzKGlucHV0RmlsZSk7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKG1hbmFnZXIucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihpbnB1dEZpbGUpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoaW5wdXRGaWxlLmxlbmd0aCgpID4gMCkKLQkJewotCQkJcGF0aCA9IG5ldyBQYXRoKGlucHV0RmlsZSk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikKLQl7Ci0JCWJvb2xlYW4gdXNlRGVmYXVsdCA9IHVzZURlZmF1bHRDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUl9XT1JLSU5HX0RJUiwgdXNlRGVmYXVsdCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1JfV09SS0lOR19ESVIsIHVzZURlZmF1bHQgPyBudWxsIDogZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pCi0JewotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SX1dPUktJTkdfRElSLCB0cnVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZykKLQl7Ci0JCXJlcXVpcmVkID0gdXNlU3BlY2lmaWNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiBzdXBlci5pc1ZhbGlkKGNvbmZpZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Zy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9kZWJ1Zy91aS90YWJzL3Jlc29sdmVyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlODVjMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2RlYnVnL3VpL3RhYnMvcmVzb2x2ZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVVJJUmVzb2x2ZXJCbG9jazIuMD1OL0EKLVVSSVJlc29sdmVyQmxvY2syLjE9V29ya2luZyBEaXJlY3RvcnkgKGRlZmF1bHQpCi1VUklSZXNvbHZlckJsb2NrMi4zPVN0eWxlc2hlZXQKLVVSSVJlc29sdmVyQmxvY2syLjQ9UmVzb2x2ZSByZWxhdGl2ZSB0bzoKLVVSSVJlc29sdmVyQmxvY2syLjU9VXNlIGN1c3RvbSBVUkkgcmVzb2x2ZXIgKE5vdGU6IGNsYXNzIG11c3QgYmUgaW5jbHVkZWQgb24gY2xhc3NwYXRoKQotVVJJUmVzb2x2ZXJCbG9jazIuNj1DbGFzczoKLVVSSVJlc29sdmVyQmxvY2syLjc9VVJJIFJlc29sdmVyCi1VUklSZXNvbHZlckJsb2NrMi44PU1pc3NpbmcgVVJJIFJlc29sdmVyIGNsYXNzIG5hbWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGEyNTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi10ZW1wLmZvbGRlcgotQGRvdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjQxZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYWNjOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgSmFuIDAzIDIyOjI0OjI1IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGY3ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgSmFuIDA0IDAxOjAyOjEzIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmYzNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jV2VkIEp1bCAzMCAyMDo1Njo1NiBCU1QgMjAwOAotY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCi1jb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKLWNvbXBpbGVycy5wLmludGVybmFsPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctYnVuZGxlLWNsYXNzcGF0aC1lbnRyaWVzPTAKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MgotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5zLmNyZWF0ZS1kb2NzPWZhbHNlCi1jb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYwotY29tcGlsZXJzLnMub3Blbi10YWdzPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOTc0OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnO2J1bmRsZS12ZXJzaW9uPSJbMC41LjAsMS4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmU7YnVuZGxlLXZlcnNpb249IlswLjUuMCwxLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLAotIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvVE9ETy50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL1RPRE8udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQ3OGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvVE9ETy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1JTlRFR1JBVEUgT1JBTkdFVk9MVCBQQVJUUzoKLQotLSBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGltYWdlCi0tIGtleXdvcmRzCi0tIGxhdW5jaCBjb25maWcgZXhwb3J0Ci0KLS0gd2hlbiBkZWJ1Z2dpbmcgdG9vIHF1aWNrbHksIGdldCBhIG51bGwgcG9pbnRlciBleGNlcHRpb24gYmVjYXVzZSB2YXJpYWJsZSB2aWV3IGlzIHRyeWluZyB0byAKLWdldCBhIHZhcmlhYmxlIGF0IHRoZSBzYW1lIHRpbWUgYXMgd2UgaGF2ZSBtb3ZlZCBvbiB0byB0aGUgbmV4dCBmcmFtZS4KLQotLSBzbW9vdGggdHJhbnNpdGlvbiBiZXR3ZWVuIGphdmEgYW5kIFhTTFQgZGVidWdnaW5nCi0tIHJlc3VsdCB2aWV3Ci0tIGxpbmsgZnJvbSByZXN1bHQgdmlldyB0byBzb3VyY2UgKyB0ZW1wbGF0ZQotLSBwcm9maWxpbmcKLQotLSBjaGFuZ2UgdmFyaWFibGUgdmFsdWUKLS0gd2F0Y2ggZXhwcmVzc2lvbnMKLS0gYnJlYWtwb2ludCBoaXQgY291bnQgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9XM0NGZWF0dXJlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9XM0NGZWF0dXJlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFhZWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvVzNDRmVhdHVyZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1GRUFUVVJFX1NFQ1VSRV9QUk9DRVNTSU5HPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9hbGxvdy1leHRlcm5hbC1mdW5jdGlvbnMKLUZFQVRVUkVfU0VDVVJFX1BST0NFU1NJTkcuVFlQRT1ib29sZWFuCi1GRUFUVVJFX1NFQ1VSRV9QUk9DRVNTSU5HLkRFU0M9dHJ1ZSBpbnN0cnVjdHMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHByb2Nlc3MgWE1MIHNlY3VyZWx5LiBUaGlzIG1heSBzZXQgbGltaXRzIG9uIFhNTCBjb25zdHJ1Y3RzIHRvIGF2b2lkIGNvbmRpdGlvbnMgc3VjaCBhcyBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2tzLlxuXAotZmFsc2UgaW5zdHJ1Y3RzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBwcm9jZXNzIFhNTCBhY29yZGluZyB0aGUgbGV0dGVyIG9mIHRoZSBYTUwgc3BlY2lmaWNhdGlvbnMgaW5nb3Jpbmcgc2VjdXJpdHkgaXNzdWVzIHN1Y2ggYXMgbGltaXRzIG9uIFhNTCBjb25zdHJ1Y3RzIHRvIGF2b2lkIGNvbmRpdGlvbnMgc3VjaCBhcyBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2tzLiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL1czQ091dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvVzNDT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWQyZmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvVzNDT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJ5dGUtb3JkZXItbWFyaz1ieXRlLW9yZGVyLW1hcmsKLWJ5dGUtb3JkZXItbWFyay5ERVNDPU9uZSBvZiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgeWVzIG9yIG5vLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VyaWFsaXplZCBzZXF1ZW5jZSBvZiBvY3RldHMgaXMgdG8gYmUgcHJlY2VkZWQgYnkgYSBCeXRlIE9yZGVyIE1hcmsuIChTZWUgU2VjdGlvbiA1LjEgb2YgW1VuaWNvZGUgRW5jb2RpbmddLikgVGhlIGFjdHVhbCBvY3RldCBvcmRlciB1c2VkIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gSWYgdGhlIGVuY29kaW5nIGRlZmluZXMgbm8gQnl0ZSBPcmRlciBNYXJrLCBvciBpZiB0aGUgQnl0ZSBPcmRlciBNYXJrIGlzIHByb2hpYml0ZWQgZm9yIHRoZSBzcGVjaWZpYyBVbmljb2RlIGVuY29kaW5nIG9yIGltcGxlbWVudGF0aW9uIGVudmlyb25tZW50LCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuIAotCi1jZGF0YS1zZWN0aW9uLWVsZW1lbnRzPWNkYXRhLXNlY3Rpb24tZWxlbWVudHMgCi1jZGF0YS1zZWN0aW9uLWVsZW1lbnRzLkRFU0M9QSBsaXN0IG9mIGV4cGFuZGVkIFFOYW1lcywgcG9zc2libHkgZW1wdHkuIAotCi1kb2N0eXBlLXB1YmxpYz1kb2N0eXBlLXB1YmxpYwotZG9jdHlwZS1wdWJsaWMuREVTQz1BIHN0cmluZyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuIFRoaXMgcGFyYW1ldGVyIG1heSBiZSBhYnNlbnQuIAotCi1kb2N0eXBlLXN5c3RlbT1kb2N0eXBlLXN5c3RlbQotZG9jdHlwZS1zeXN0ZW0uREVTQz1BIHN0cmluZyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuIFRoaXMgcGFyYW1ldGVyIG1heSBiZSBhYnNlbnQuIAotCi1lbmNvZGluZz1lbmNvZGluZyAKLWVuY29kaW5nLkRFU0M9QSBzdHJpbmcgb2YgVW5pY29kZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAjeDIxIHRvICN4N0UgKHRoYXQgaXMsIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzKTsgdGhlIHZhbHVlIFNIT1VMRCBiZSBhIGNoYXJzZXQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBJbnRlcm5ldCBBc3NpZ25lZCBOdW1iZXJzIEF1dGhvcml0eSBbSUFOQV0sIFtSRkMyMjc4XSBvciBiZWdpbiB3aXRoIHRoZSBjaGFyYWN0ZXJzIHgtIG9yIFgtLiAKLQotZXNjYXBlLXVyaS1hdHRyaWJ1dGVzPWVzY2FwZS11cmktYXR0cmlidXRlcwotZXNjYXBlLXVyaS1hdHRyaWJ1dGVzLkRFU0M9T25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyB5ZXMgb3Igbm8uIAotCi1pbmNsdWRlLWNvbnRlbnQtdHlwZT1pbmNsdWRlLWNvbnRlbnQtdHlwZQotaW5jbHVkZS1jb250ZW50LXR5cGUuREVTQz1PbmUgb2YgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIHllcyBvciBuby4gCi0KLWluZGVudD1pbmRlbnQKLWluZGVudC5ERVNDPU9uZSBvZiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgeWVzIG9yIG5vLiAKLQotbWVkaWEtdHlwZT1tZWRpYS10eXBlCi1tZWRpYS10eXBlLkRFU0M9QSBzdHJpbmcgb2YgVW5pY29kZSBjaGFyYWN0ZXJzIHNwZWNpZnlpbmcgdGhlIG1lZGlhIHR5cGUgKE1JTUUgY29udGVudCB0eXBlKSBbUkZDMjA0Nl07IHRoZSBjaGFyc2V0IHBhcmFtZXRlciBvZiB0aGUgbWVkaWEgdHlwZSBNVVNUIE5PVCBiZSBzcGVjaWZpZWQgZXhwbGljaXRseSBpbiB0aGUgdmFsdWUgb2YgdGhlIG1lZGlhLXR5cGUgcGFyYW1ldGVyLiBJZiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHNlcmlhbGl6ZWQgb3V0cHV0IGlzIGFubm90YXRlZCB3aXRoIGEgbWVkaWEgdHlwZSwgdGhpcyBwYXJhbWV0ZXIgTUFZIGJlIHVzZWQgdG8gcHJvdmlkZSBzdWNoIGFuIGFubm90YXRpb24uIEZvciBleGFtcGxlLCBpdCBNQVkgYmUgdXNlZCB0byBzZXQgdGhlIG1lZGlhIHR5cGUgaW4gYW4gSFRUUCBoZWFkZXIuIAotCi1tZXRob2Q9bWV0aG9kCi1tZXRob2QuREVTQz1BbiBleHBhbmRlZCBRTmFtZSB3aXRoIGEgbnVsbCBuYW1lc3BhY2UgVVJJLCBhbmQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIG5hbWUgZXF1YWwgdG8gb25lIG9mIHhtbCwgeGh0bWwsIGh0bWwgb3IgdGV4dCwgb3IgaGF2aW5nIGEgbm9uLW51bGwgbmFtZXNwYWNlIFVSSS4gSWYgdGhlIG5hbWVzcGFjZSBVUkkgaXMgbm9uLW51bGwsIHRoZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgb3V0cHV0IG1ldGhvZC4gCi0KLW5vcm1hbGl6YXRpb24tZm9ybT1ub3JtYWxpemF0aW9uLWZvcm0gCi1ub3JtYWxpemF0aW9uLWZvcm0uREVTQz1PbmUgb2YgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIE5GQywgTkZELCBORktDLCBORktELCBmdWxseS1ub3JtYWxpemVkLCBub25lIG9yIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdmFsdWUuIAotCi1vbWl0LXhtbC1kZWNsYXJhdGlvbj1vbWl0LXhtbC1kZWNsYXJhdGlvbiAKLW9taXQteG1sLWRlY2xhcmF0aW9uLkRFU0M9T25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyB5ZXMgb3Igbm8uIAotCi1zdGFuZGFsb25lPXN0YW5kYWxvbmUgCi1zdGFuZGFsb25lLkRFU0M9T25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyB5ZXMsIG5vIG9yIG9taXQuIAotCi11bmRlY2xhcmUtcHJlZml4ZXM9dW5kZWNsYXJlLXByZWZpeGVzIAotdW5kZWNsYXJlLXByZWZpeGVzLkRFU0M9T25lIG9mIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyB5ZXMgb3Igbm8uIAotCi11c2UtY2hhcmFjdGVyLW1hcHM9dXNlLWNoYXJhY3Rlci1tYXBzIAotdXNlLWNoYXJhY3Rlci1tYXBzLkRFU0M9QSBsaXN0IG9mIHBhaXJzLCBwb3NzaWJseSBlbXB0eSwgd2l0aCBlYWNoIHBhaXIgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhbmQgYSBzdHJpbmcgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLiAKLQotdmVyc2lvbj12ZXJzaW9uIAotdmVyc2lvbi5ERVNDPUEgc3RyaW5nIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE0NGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIFczQ0ZlYXR1cmVzLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgVzNDT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZiZGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZwotQnVuZGxlLU5hbWUuMCA9IFhTTCBUcmFuc2Zvcm0gTGF1bmNoaW5nIChJbmN1YmF0aW5nKQotbGF1bmNoQ29uZmlndXJhdGlvblR5cGUubmFtZS4wID0gWFNMCi1zb3VyY2VMb2NhdG9yLm5hbWUuMCA9IFhTTFQgU291cmNlIExvb2t1cCBEaXJlY3RvcgotcHJvY2Vzc29yVHlwZS5sYWJlbC4wID0gSlJFIERlZmF1bHQKLXByb2Nlc3Nvci5sYWJlbC4wID0gSlJFIEluc3RhbmNlIERlZmF1bHQKLWV4dGVuc2lvbi1wb2ludC5uYW1lLjAgPSBYU0xUIFByb2Nlc3NvciBJbnZva2VyCi1leHRlbnNpb24tcG9pbnQubmFtZS4xID0gWFNMVCBQcm9jZXNzb3IgVHlwZQotZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMiA9IFhTTFQgUHJvY2Vzc29yCi1leHRlbnNpb24tcG9pbnQubmFtZS4zID0gWFNMVCBEZWJ1Z2dlcgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzI3ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iaW52b2tlIiBuYW1lPSIlZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMCIKLQkJc2NoZW1hPSJzY2hlbWEvaW52b2tlLmV4c2QiIC8+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0icHJvY2Vzc29yVHlwZSIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjEiCi0JCXNjaGVtYT0ic2NoZW1hL3Byb2Nlc3NvclR5cGUuZXhzZCIgLz4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwcm9jZXNzb3IiIG5hbWU9IiVleHRlbnNpb24tcG9pbnQubmFtZS4yIgotCQlzY2hlbWE9InNjaGVtYS9wcm9jZXNzb3IuZXhzZCIgLz4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZWJ1Z2dlciIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjMiIHNjaGVtYT0ic2NoZW1hL2RlYnVnZ2VyLmV4c2QiLz4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGVzIj4KLQkJPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlCi0gICAgICAgICAgICBzb3VyY2VMb2NhdG9ySWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnNvdXJjZUxvb2t1cERpcmVjdG9yIgotICAgICAgICAgICAgc291cmNlUGF0aENvbXB1dGVySWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnNvdXJjZVBhdGhDb21wdXRlciIKLQkJCWRlbGVnYXRlPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotCQkJbW9kZXM9InJ1biwgZGVidWcsIHByb2ZpbGUiIG5hbWU9IiVsYXVuY2hDb25maWd1cmF0aW9uVHlwZS5uYW1lLjAiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2VMb2NhdG9ycyI+Ci0gICAgICA8c291cmNlTG9jYXRvcgotICAgICAgICAgICAgbmFtZT0iJXNvdXJjZUxvY2F0b3IubmFtZS4wIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlhTTFRTb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5zb3VyY2VMb29rdXBEaXJlY3RvciI+Ci0gICAgICA8L3NvdXJjZUxvY2F0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlUGF0aENvbXB1dGVycyI+Ci0gICAgICA8c291cmNlUGF0aENvbXB1dGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuWFNMVFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnNvdXJjZVBhdGhDb21wdXRlciI+Ci0gICAgICA8L3NvdXJjZVBhdGhDb21wdXRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYnJlYWtwb2ludHMiPgotICAgICAgPGJyZWFrcG9pbnQKLSAgICAgIAkJaWQ9InhzbExpbmVCcmVha3BvaW50IgotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcueHNsTGluZUJyZWFrcG9pbnRNYXJrZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuWFNMTGluZUJyZWFrcG9pbnQiPgotICAgICAgPC9icmVha3BvaW50PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ4c2xMaW5lQnJlYWtwb2ludE1hcmtlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5saW5lQnJlYWtwb2ludE1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgIDwvZXh0ZW5zaW9uPgotIAkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiPgotCQk8L2luaXRpYWxpemVyPgotCTwvZXh0ZW5zaW9uPgotIAotIAk8ZXh0ZW5zaW9uCi0JICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5wcm9jZXNzb3JUeXBlIj4KLSAgICAgPHByb2Nlc3NvclR5cGUKLSAgICAgICAgICAgIGZlYXR1cmVQcm9wZXJ0aWVzPSJXM0NQcm9jZXNzb3JGZWF0dXJlcy5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUuanJlRGVmYXVsdCIKLSAgICAgICAgICAgIGxhYmVsPSIlcHJvY2Vzc29yVHlwZS5sYWJlbC4wIgotICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllcz0iVzNDT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzIiAvPgotCSA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yIj4KLSAgICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgICBjbGFzc3BhdGg9IiIKLSAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpyZS5kZWZhdWx0IgotICAgICAgICAgICAgICBsYWJlbD0iJXByb2Nlc3Nvci5sYWJlbC4wIgotICAgICAgICAgICAgICBwcm9jZXNzb3JUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUuanJlRGVmYXVsdCIKLSAgICAgICAgICAgICAgc3VwcG9ydHM9IjEuMCIvPgotCSA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zY2hlbWEvZGVidWdnZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL2RlYnVnZ2VyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDI3ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zY2hlbWEvZGVidWdnZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmciIGlkPSJkZWJ1Z2dlciIgbmFtZT0iWFNMVCBEZWJ1Z2dlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVidWdnZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVidWdnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9jZXNzb3JUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZxdW90OyZndDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZsdDsvYSZndDsuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL2ludm9rZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zY2hlbWEvaW52b2tlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NTZkMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zY2hlbWEvaW52b2tlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmciPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIiBpZD0iaW52b2tlIiBuYW1lPSJYU0xUIFByb2Nlc3NvciBJbnZva2VyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnZva2VyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imludm9rZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBVbmlxdWUgaWQgZm9yIHRoaXMgaW52b2tlcgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBJUHJvY2Vzc29ySW52b2tlciBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzZW1pLWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGphcnMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvbnRyaWJ1dGluZyBwbHVnaW4uIE9uZSBvZiB0aGUgamFycyBtdXN0IGNvbnRhaW4gdGhlIEludm9rZXIgY2xhc3MgbmFtZWQgaW4gdGhlIGNsYXNzIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmcXVvdDsmZ3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmbHQ7L2EmZ3Q7LiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NjaGVtYS9wcm9jZXNzb3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL3Byb2Nlc3Nvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTM0NWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc2NoZW1hL3Byb2Nlc3Nvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZyIgaWQ9InByb2Nlc3NvciIgbmFtZT0iWFNMVCBQcm9jZXNzb3IiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29udHJpYnV0ZSBhIEphdmEgWFNMVCBwcm9jZXNzb3IgaW5zdGFuY2UgKGUuZy4gWGFsYW4gMi43LjApLiBUaGUgZXh0ZW5zaW9uIHBvaW50IHByaW1hcmlseSBkZWZpbmVzIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIGxhdW5jaGluZyBhbiBYU0xUIHRyYW5zZm9ybWF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9jZXNzb3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc29yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJsYWJlbCIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2Nlc3NvclR5cGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWdnZXJJZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwb3J0cyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHN1cHBvcnRlZCBYU0xUIHZlcnNpb25zIGUuZy4gMS4wLDIuMAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvciZxdW90OyZndDsKLSAgICAgICZsdDtwcm9jZXNzb3IKLSAgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDt4YWxhbjIuNy4wLmphcjtzZXJpYWxpemVyMi43LjAuamFyJnF1b3Q7Ci0gICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy54YWxhbi4yXzdfMCZxdW90OwotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7WGFsYW4gMi43LjAmcXVvdDsKLSAgICAgICAgICAgIHByb2Nlc3NvclR5cGVJZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLnByb2Nlc3NvclR5cGUmcXVvdDsKLSAgICAgICAgICAgIGRlYnVnZ2VySWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlciZxdW90OwotICAgICAgICAgICAgc3VwcG9ydHM9JnF1b3Q7MS4wJnF1b3Q7Jmd0OwotICAgICAgJmx0Oy9wcm9jZXNzb3ImZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmcXVvdDsmZ3Q7aHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsmbHQ7L2EmZ3Q7LiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NjaGVtYS9wcm9jZXNzb3JUeXBlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NjaGVtYS9wcm9jZXNzb3JUeXBlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTZmZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zY2hlbWEvcHJvY2Vzc29yVHlwZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZyIgaWQ9InByb2Nlc3NvclR5cGUiIG5hbWU9IlhTTFQgUHJvY2Vzc29yIFR5cGUiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29udHJpYnV0ZSBhIEphdmEgWFNMVCBwcm9jZXNzb3IgdHlwZSAoZS5nLiBYYWxhbiwgU2F4b24pLiBUaGUgcHJvY2Vzc29yIHR5cGUgZGVmaW5lcyB3aGljaCBmZWF0dXJlcyBhbmQgb3V0cHV0IHByb3BlcmllcyBhcmUgc3VwcG9ydGVkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9jZXNzb3JUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NvclR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9ImxhYmVsIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFVuaXF1ZSBpZCBmb3IgdGhlIHByb2Nlc3NvciB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTmFtZSBmb3IgZGlzcGxheSBpbiB0aGUgVUkKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyRmFjdG9yeSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciBmYWN0b3J5IGNsYXNzIG5hbWUgZm9yIHRoaXMgcHJvY2Vzc29yIHR5cGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXRQcm9wZXJ0aWVzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIExvY2F0aW9uIG9mIGEgcHJvcGVydGllcyBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgdGhlIHByb2Nlc3NvcnMgb3V0cHV0IHByb3BlcnRpZXMuIE11c3QgYmUgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBidW5kbGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmVhdHVyZVByb3BlcnRpZXMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTG9jYXRpb24gb2YgYSBwcm9wZXJ0aWVzIGZpbGUgY29udGFpbmluZyB0aGUgbGlzdCBvZiB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgcHJvY2Vzc29yLiBNdXN0IGJlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgYnVuZGxlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cHJvY2Vzc29yVHlwZQotICAgICAgICAgICAgZmVhdHVyZVByb3BlcnRpZXM9JnF1b3Q7WGFsYW5GZWF0dXJlcy5wcm9wZXJ0aWVzJnF1b3Q7Ci0gICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLnByb2Nlc3NvclR5cGUmcXVvdDsKLSAgICAgICAgICAgIGxhYmVsPSZxdW90O1hhbGFuJnF1b3Q7Ci0gICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzPSZxdW90O1hhbGFuT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzJnF1b3Q7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lckZhY3Rvcnk9JnF1b3Q7b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCZxdW90OyZndDsKLSAgICAgICZsdDsvcHJvY2Vzc29yVHlwZSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZxdW90OyZndDtodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51ayZsdDsvYSZndDsuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0RlYnVnZ2VyRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvRGVidWdnZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTZlODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvRGVidWdnZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSURlYnVnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgRGVidWdnZXJEZXNjcmlwdG9yIGltcGxlbWVudHMgSURlYnVnZ2VyCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjbGFzc3BhdGg7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlSWQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9jZXNzb3JUeXBlSWQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOwotCi0JcHVibGljIERlYnVnZ2VyRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBidW5kbGVJZCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nW10gY2xhc3NwYXRoLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHByb2Nlc3NvclR5cGVJZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0JCXRoaXMuYnVuZGxlSWQgPSBidW5kbGVJZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wcm9jZXNzb3JUeXBlSWQgPSBwcm9jZXNzb3JUeXBlSWQ7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLQl7Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENsYXNzUGF0aCgpCi0JewotCQlyZXR1cm4gUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IuY3JlYXRlRW50cmllcyhidW5kbGVJZCwgY2xhc3NwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JUeXBlIGdldFByb2Nlc3NvclR5cGUoKQotCXsKLQkJcmV0dXJuIFhTTFRSdW50aW1lLmdldFByb2Nlc3NvclR5cGUocHJvY2Vzc29yVHlwZUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9GZWF0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjkwMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSUZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlIGltcGxlbWVudHMgSUZlYXR1cmUsIENvbXBhcmFibGU8T2JqZWN0PgotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIHVyaTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOwotCi0JcHVibGljIEZlYXR1cmUoU3RyaW5nIHVyaSwgU3RyaW5nIHR5cGUsIFN0cmluZyBkZXNjcmlwdGlvbikKLQl7Ci0JCXRoaXMudXJpID0gdXJpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLQl7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVWYWx1ZShTdHJpbmcgdmFsdWUpCi0JewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChUWVBFX0JPT0xFQU4uZXF1YWxzKHR5cGUpKQotCQl7Ci0JCQlib29sZWFuIHZhbGlkID0gInRydWUiLmVxdWFscyh2YWx1ZSkgfHwgImZhbHNlIi5lcXVhbHModmFsdWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmICghdmFsaWQpCi0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmUuMiIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKFRZUEVfSU5ULmVxdWFscyh0eXBlKSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmUuMSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKFRZUEVfRE9VQkxFLmVxdWFscyh0eXBlKSkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmdldFN0cmluZygiRmVhdHVyZS4wIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoVFlQRV9GTE9BVC5lcXVhbHModHlwZSkpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUZsb2F0LnBhcnNlRmxvYXQodmFsdWUpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJGZWF0dXJlLjUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIGlmIChUWVBFX0NMQVNTLmVxdWFscyh0eXBlKSB8fCBUWVBFX09CSkVDVC5lcXVhbHModHlwZSkpCi0JCXsKLQkJCXN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZSh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykKLQl7Ci0JCWlmIChvIGluc3RhbmNlb2YgSUZlYXR1cmUpCi0JCXsKLQkJCUlGZWF0dXJlIGYgPSAoSUZlYXR1cmUpIG87Ci0JCQlyZXR1cm4gZi5nZXRVUkkoKS5jb21wYXJlVG8oZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0ZlYXR1cmVQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvRmVhdHVyZVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWNkZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvRmVhdHVyZVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUHJlZmVyZW5jZXMKLXsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHR5cGVGZWF0dXJlczsKLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEZlYXR1cmVzVmFsdWVzKFN0cmluZyB0eXBlSWQpCi0JewotCQlyZXR1cm4gdHlwZUZlYXR1cmVzLmdldCh0eXBlSWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGVGZWF0dXJlcyhNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiB0eXBlRmVhdHVyZXMpCi0JewotCQl0aGlzLnR5cGVGZWF0dXJlcyA9IHR5cGVGZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFzWE1MKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoKTsKLQkJRWxlbWVudCBjb25maWcgPSBkb2MuY3JlYXRlRWxlbWVudCgiZmVhdHVyZVByZWZlcmVuY2VzIik7ICAvLyROT04tTkxTLTEkCi0JCWRvYy5hcHBlbmRDaGlsZChjb25maWcpOwotCQkKLQkJZm9yIChTdHJpbmcgdHlwZUlkIDogdHlwZUZlYXR1cmVzLmtleVNldCgpKQotCQl7Ci0JCQlFbGVtZW50IHByb2Nlc3NvclR5cGVFbGVtZW50ID0gdHlwZUFzRWxlbWVudChkb2MsIHR5cGVJZCk7Ci0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMgPSB0eXBlRmVhdHVyZXMuZ2V0KHR5cGVJZCk7Ci0JCQlmZWF0dXJlVmFsdWVzQXNFbGVtZW50KGRvYywgcHJvY2Vzc29yVHlwZUVsZW1lbnQsIGZlYXR1cmVWYWx1ZXMpOwotCQkJY29uZmlnLmFwcGVuZENoaWxkKHByb2Nlc3NvclR5cGVFbGVtZW50KTsKLQkJfQotCi0JCS8vIFNlcmlhbGl6ZSB0aGUgRG9jdW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIFN0cmluZwotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuc2VyaWFsaXplRG9jdW1lbnQoZG9jKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVQcmVmZXJlbmNlcyBmcm9tWE1MKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJRmVhdHVyZVByZWZlcmVuY2VzIHByZWZzID0gbmV3IEZlYXR1cmVQcmVmZXJlbmNlcygpOwotCi0JCS8vIERvIHRoZSBwYXJzaW5nIGFuZCBvYnRhaW4gdGhlIHRvcC1sZXZlbCBub2RlCi0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKLQkJRWxlbWVudCBjb25maWcgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gdHlwZUZlYXR1cmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PigpOwotCQlFbGVtZW50W10gcHJvY2Vzc29yVHlwZUVscyA9IFByZWZlcmVuY2VVdGlsLmdldENoaWxkRWxlbWVudHMoY29uZmlnLCAicHJvY2Vzc29yVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc29yVHlwZUVscy5sZW5ndGg7ICsraSkKLQkJewotCQkJRWxlbWVudCBwcm9jZXNzb3JUeXBlRWwgPSBwcm9jZXNzb3JUeXBlRWxzW2ldOwotCQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50QXNUeXBlKHByb2Nlc3NvclR5cGVFbCk7Ci0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMgPSBlbGVtZW50QXNGZWF0dXJlVmFsdWVzKHByb2Nlc3NvclR5cGVFbCk7Ci0JCQl0eXBlRmVhdHVyZXMucHV0KHR5cGUsIGZlYXR1cmVWYWx1ZXMpOwotCQl9Ci0KLQkJcHJlZnMuc2V0VHlwZUZlYXR1cmVzKHR5cGVGZWF0dXJlcyk7Ci0KLQkJcmV0dXJuIHByZWZzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlbGVtZW50QXNUeXBlKEVsZW1lbnQgcGFyZW50KQotCXsKLQkJU3RyaW5nIGlkID0gcGFyZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCB0eXBlQXNFbGVtZW50KERvY3VtZW50IGRvYywgU3RyaW5nIHR5cGUpCi0JewotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvY2Vzc29yVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJpZCIsIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZWxlbWVudEFzRmVhdHVyZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQpCi0JewotCQlFbGVtZW50W10gZmVhdHVyZUVscyA9IFByZWZlcmVuY2VVdGlsLmdldENoaWxkRWxlbWVudHMoZWxlbWVudCwgImZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oZmVhdHVyZUVscy5sZW5ndGgpOwotCQlmb3IgKEVsZW1lbnQgZmVhdHVyZUVsIDogZmVhdHVyZUVscykKLQkJewotCQkJU3RyaW5nIHVyaSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoInVyaSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBmZWF0dXJlRWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlmZWF0dXJlVmFsdWVzLnB1dCh1cmksIHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZmVhdHVyZVZhbHVlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZlYXR1cmVWYWx1ZXNBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBFbGVtZW50IGZlYXR1cmVzRWwsIE1hcDxTdHJpbmcsIFN0cmluZz4gZmVhdHVyZVZhbHVlcykKLQl7Ci0JCWlmIChmZWF0dXJlVmFsdWVzICE9IG51bGwpCi0JCXsKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZyxTdHJpbmc+IGVudHJ5MiA6IGZlYXR1cmVWYWx1ZXMuZW50cnlTZXQoKSkKLQkJCXsKLQkJCQlTdHJpbmcgdXJpID0gKFN0cmluZykgZW50cnkyLmdldEtleSgpOwotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5Mi5nZXRWYWx1ZSgpOwotCQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJmZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgidXJpIiwgdXJpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZlYXR1cmVzRWwuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9MYXVuY2hpbmdQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0xhdW5jaGluZ1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGFiYjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL0xhdW5jaGluZ1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hpbmdQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIExhdW5jaGluZ1BsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgTGF1bmNoaW5nUGx1Z2luKCkKLQl7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExhdW5jaGluZ1BsdWdpbiBnZXREZWZhdWx0KCkKLQl7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhFeGNlcHRpb24gZSkKLQl7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsICIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKENvcmVFeGNlcHRpb24gZSkKLQl7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTM4MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL091dHB1dFByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9PdXRwdXRQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTlkZjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL091dHB1dFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklPdXRwdXRQcm9wZXJ0eTsKLQotcHVibGljIGNsYXNzIE91dHB1dFByb3BlcnR5IGltcGxlbWVudHMgSU91dHB1dFByb3BlcnR5Ci17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjOwotCi0JcHVibGljIE91dHB1dFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyBkZXNjKQotCXsKLQkJdGhpcy5uYW1lID0ga2V5OwotCQl0aGlzLmRlc2MgPSBkZXNjOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9PdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9PdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjkxOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcwotewotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUHJvcGVydGllcz4gdHlwZVByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnRpZXM+KCk7Ci0KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhTdHJpbmcgdHlwZUlkKQotCXsKLQkJcmV0dXJuIChQcm9wZXJ0aWVzKSB0eXBlUHJvcGVydGllcy5nZXQodHlwZUlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyhTdHJpbmcgdHlwZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpCi0JewotCQl0eXBlUHJvcGVydGllcy5wdXQodHlwZUlkLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFzWE1MKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoKTsKLQkJRWxlbWVudCBjb25maWcgPSBkb2MuY3JlYXRlRWxlbWVudCgib3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCWRvYy5hcHBlbmRDaGlsZChjb25maWcpOwotCi0JCWZvciAoU3RyaW5nIHR5cGUgOiB0eXBlUHJvcGVydGllcy5rZXlTZXQoKSkKLQkJewotCQkJRWxlbWVudCBwcm9jZXNzb3JUeXBlRWxlbWVudCA9IHR5cGVBc0VsZW1lbnQoZG9jLCB0eXBlKTsKLQkJCVByb3BlcnRpZXMgcHJvcGVydHlWYWx1ZXMgPSAoUHJvcGVydGllcykgdHlwZVByb3BlcnRpZXMuZ2V0KHR5cGUpOwotCQkJZmVhdHVyZVZhbHVlc0FzRWxlbWVudChkb2MsIHByb2Nlc3NvclR5cGVFbGVtZW50LCBwcm9wZXJ0eVZhbHVlcyk7Ci0JCQljb25maWcuYXBwZW5kQ2hpbGQocHJvY2Vzc29yVHlwZUVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gU2VyaWFsaXplIHRoZSBEb2N1bWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgU3RyaW5nCi0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyBmcm9tWE1MKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gRG8gdGhlIHBhcnNpbmcgYW5kIG9idGFpbiB0aGUgdG9wLWxldmVsIG5vZGUKLQkJRG9jdW1lbnQgZG9jID0gUHJlZmVyZW5jZVV0aWwuZ2V0RG9jdW1lbnQoaW5wdXRTdHJlYW0pOwotCQlFbGVtZW50IGNvbmZpZyA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotCQlFbGVtZW50W10gcHJvY2Vzc29yVHlwZUVscyA9IFByZWZlcmVuY2VVdGlsLmdldENoaWxkRWxlbWVudHMoY29uZmlnLCAicHJvY2Vzc29yVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvY2Vzc29yVHlwZUVscy5sZW5ndGg7ICsraSkKLQkJewotCQkJRWxlbWVudCBwcm9jZXNzb3JUeXBlRWwgPSBwcm9jZXNzb3JUeXBlRWxzW2ldOwotCQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50QXNUeXBlKHByb2Nlc3NvclR5cGVFbCk7Ci0JCQlQcm9wZXJ0aWVzIGZlYXR1cmVWYWx1ZXMgPSBlbGVtZW50QXNQcm9wZXJ0eVZhbHVlcyhwcm9jZXNzb3JUeXBlRWwpOwotCQkJcHJlZnMuc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXModHlwZSwgZmVhdHVyZVZhbHVlcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVsZW1lbnRBc1R5cGUoRWxlbWVudCBwYXJlbnQpCi0JewotCQlTdHJpbmcgaWQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50IHR5cGVBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBTdHJpbmcgdHlwZSkKLQl7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwcm9jZXNzb3JUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImlkIiwgdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBlbGVtZW50QXNQcm9wZXJ0eVZhbHVlcyhFbGVtZW50IGVsZW1lbnQpCi0JewotCQlFbGVtZW50W10gcHJvcGVydHlFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsICJwcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgcHJvcGVydHlWYWx1ZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQlmb3IgKEVsZW1lbnQgZmVhdHVyZUVsIDogcHJvcGVydHlFbHMpCi0JCXsKLQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBmZWF0dXJlRWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9wZXJ0eVZhbHVlcy5wdXQobmFtZSwgdmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eVZhbHVlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZlYXR1cmVWYWx1ZXNBc0VsZW1lbnQoRG9jdW1lbnQgZG9jLCBFbGVtZW50IGZlYXR1cmVzRWwsIFByb3BlcnRpZXMgcHJvcGVydHlWYWx1ZXMpCi0JewotCQlpZiAocHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkKLQkJewotCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0LE9iamVjdD4gZW50cnkyIDogcHJvcGVydHlWYWx1ZXMuZW50cnlTZXQoKSkKLQkJCXsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5Mi5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeTIuZ2V0VmFsdWUoKTsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmZWF0dXJlc0VsLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUGx1Z2luUHJvY2Vzc29ySmFyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9QbHVnaW5Qcm9jZXNzb3JKYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzI0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9QbHVnaW5Qcm9jZXNzb3JKYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JKYXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFBsdWdpblByb2Nlc3NvckphciBpbXBsZW1lbnRzIElQcm9jZXNzb3JKYXIKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIGZpbmFsIElQYXRoIHBhdGg7Ci0KLQlwdWJsaWMgUGx1Z2luUHJvY2Vzc29ySmFyKFN0cmluZyBwbHVnaW5JZCwgSVBhdGggcGF0aCkKLQl7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQlwdWJsaWMgVVJMIGFzVVJMKCkKLQl7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJLy8gRklYTUUgdmVyeSBjbHVtc3kgd2F5IHRvIGdldCBsb2NhdGlvbiBvcmJpdCBqYXIgZmlsZQotCQkJLy8gVGhlcmUgaXMgc3VyZWx5IGEgYmV0dGVyIHdheSwgYnV0IEkgY2FuJ2QgZmluZCBpdC4KLQkJCWlmIChwYXRoID09IG51bGwpCi0JCQl7Ci0JCQkJdXJsID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkJCVN0cmluZyBzID0gdXJsLmdldFBhdGgoKTsKLQkJCQlpZiAocy5lbmRzV2l0aCgiIS8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJcyA9IHMuc3Vic3RyaW5nKDAscy5sZW5ndGgoKS0yKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLmRlYnVnTGF1bmNoZXIpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHMpOwotCQkJCX0KLQkJCQl1cmwgPSBuZXcgVVJMKHMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlQYXRoIGphclBhdGggPSBuZXcgUGF0aCgiLyIgKyBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBqYXJQYXRoLCBudWxsKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCXVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkKLQl7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuICJQbHVnaW4gIiArIHBsdWdpbklkICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJQbHVnaW5Qcm9jZXNzb3JKYXIuMCIpICsgcGF0aDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5MmEwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMVFJ1bnRpbWU7Ci0KLS8qKgotICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcgotewotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEKTsKLQotCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBQcm9jZXNzb3JQcmVmZXJlbmNlcygpOwotCQlwcmVmcy5zZXREZWZhdWx0UHJvY2Vzc29ySWQoWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX0lEKTsKLQotCQlPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIG91dHB1dFByZWZzID0gbmV3IE91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXMoKTsKLQkJb3V0cHV0UHJlZnMuc2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX1RZUEVfSUQsIFhTTFRSdW50aW1lLmNyZWF0ZURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzKFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lEKSk7Ci0JCW91dHB1dFByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuWEFMQU5fVFlQRV9JRCwgWFNMVFJ1bnRpbWUuY3JlYXRlRGVmYXVsdE91dHB1dFByb3BlcnRpZXMoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5YQUxBTl9UWVBFX0lEKSk7Ci0JCW91dHB1dFByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fVFlQRV9JRCwgWFNMVFJ1bnRpbWUuY3JlYXRlRGVmYXVsdE91dHB1dFByb3BlcnRpZXMoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5TQVhPTl9UWVBFX0lEKSk7Ci0JCW91dHB1dFByZWZzLnNldE91dHB1dFByb3BlcnR5VmFsdWVzKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fMV8wX1RZUEVfSUQsIFhTTFRSdW50aW1lLmNyZWF0ZURlZmF1bHRPdXRwdXRQcm9wZXJ0aWVzKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fMV8wX1RZUEVfSUQpKTsKLQotCQl0cnkKLQkJewotCQkJU3RyaW5nIHhtbCA9IHByZWZzLmdldEFzWE1MKCk7Ci0JCQlub2RlLnB1dChYU0xUUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwsIHhtbCk7Ci0KLQkJCXhtbCA9IG91dHB1dFByZWZzLmdldEFzWE1MKCk7Ci0JCQlub2RlLnB1dChYU0xUUnVudGltZS5QUkVGX09VVFBVVF9QUk9QRVJUSUVTX1hNTCwgeG1sKTsKLQotCQkJbm9kZS5wdXQoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFRkFVTFRfREVCVUdHSU5HX0lOU1RBTExfSUQsICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy54YWxhbi5wcm9jZXNzb3IiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9QcmVmZXJlbmNlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyYzE1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9QcmVmZXJlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlVXRpbAotewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUNvcmVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0JewotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQlEb2N1bWVudCBkb2MgPSBkb2NCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplRG9jdW1lbnQoRG9jdW1lbnQgZG9jKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0JewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotCQlUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgIC8vJE5PTi1OTFMtMSQKLQotCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotCQlTdHJlYW1SZXN1bHQgb3V0cHV0VGFyZ2V0ID0gbmV3IFN0cmVhbVJlc3VsdChzKTsKLQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgb3V0cHV0VGFyZ2V0KTsKLQotCQlyZXR1cm4gcy50b1N0cmluZygiVVRGOCIpOyAJCQkgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudFtdIGdldENoaWxkRWxlbWVudHMoRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKQotCXsKLQkJTGlzdDxFbGVtZW50PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsKLQkJTm9kZUxpc3QgbGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBsZW5ndGggPSBsaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQotCQl7Ci0JCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlzaG9ydCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQl7Ci0JCQkJRWxlbWVudCBwcm9jZXNzb3JFbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJaWYgKHByb2Nlc3NvckVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJewotCQkJCQljaGlsZHJlbi5hZGQocHJvY2Vzc29yRWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoRWxlbWVudFtdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBFbGVtZW50WzBdKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlVGV4dChOb2RlIG5vZGUpCi0JewotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLQkJewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCXsKLQkJCQkJTm9kZSBjaGlsZCA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLQkJCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCXsKLQkJCQkJCXNiLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFOgotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBEZWZhdWx0SGFuZGxlcigpKTsKLQkJCWRvYyA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlQcmVmZXJlbmNlVXRpbC5jcmVhdGVDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQlQcmVmZXJlbmNlVXRpbC5jcmVhdGVDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0JCXsKLQkJCVByZWZlcmVuY2VVdGlsLmNyZWF0ZUNvcmVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkKLQkJewotCQkJUHJlZmVyZW5jZVV0aWwuY3JlYXRlQ29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCXRyeQotCQkJewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJUHJlZmVyZW5jZVV0aWwuY3JlYXRlQ29yZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9Qcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODY4MmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckludm9rZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvciBpbXBsZW1lbnRzIElQcm9jZXNzb3JJbnZva2VyCi17Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpbnZva2VyQ2xhc3M7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjbGFzc3BhdGg7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlSWQ7Ci0KLQlwdWJsaWMgUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgYnVuZGxlSWQsIFN0cmluZyBpbnZva2VyQ2xhc3MsIFN0cmluZ1tdIGNsYXNzcGF0aCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5idW5kbGVJZCA9IGJ1bmRsZUlkOwotCQl0aGlzLmludm9rZXJDbGFzcyA9IGludm9rZXJDbGFzczsKLQkJdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENsYXNzcGF0aEVudHJpZXMoKQotCXsKLQkJcmV0dXJuIGNyZWF0ZUVudHJpZXMoYnVuZGxlSWQsY2xhc3NwYXRoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjcmVhdGVFbnRyaWVzKFN0cmluZyBidW5kbGVJZCwgU3RyaW5nW10gY2xhc3NwYXRoKQotCXsKLQkJTGlzdDxTdHJpbmc+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdHJ5IHsKLQkJCS8vIGlmIGluIGRldiBtb2RlLCB1c2UgdGhlIGJpbiBkaXIKLQkJCWlmIChQbGF0Zm9ybS5pbkRldmVsb3BtZW50TW9kZSgpKQotCQkJCWVudHJpZXMuYWRkKFV0aWxzLmdldEZpbGVMb2NhdGlvbihidW5kbGVJZCwgIi9iaW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoU3RyaW5nIGphciA6IGNsYXNzcGF0aCkKLQkJCXsKLQkJCQlTdHJpbmcgZW50cnk7Ci0JCQkJaWYgKGphci5zdGFydHNXaXRoKCIke2VjbGlwc2Vfb3JiaXQ6IikgJiYgamFyLmVuZHNXaXRoKCJ9IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXsKLQkJCQkJamFyID0gamFyLnN1YnN0cmluZygiJHtlY2xpcHNlX29yYml0OiIubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWphciA9IGphci5zdWJzdHJpbmcoMCxqYXIubGVuZ3RoKCktMSk7Ci0JCQkJCWVudHJ5ID0gVXRpbHMuZ2V0UGx1Z2luTG9jYXRpb24oamFyKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZW50cnkgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsamFyKTsKLQkJCQl9Ci0JCQkJaWYgKGVudHJ5IT1udWxsKQotCQkJCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQl9Ci0JCX0gCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIAotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBJUHJvY2Vzc29ySW52b2tlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW52b2tlckNsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gaW52b2tlckNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3Nvckphci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJvY2Vzc29ySmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWMxN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJvY2Vzc29ySmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29ySmFyIGltcGxlbWVudHMgSVByb2Nlc3NvckphcgotewotCXByaXZhdGUgZmluYWwgSVBhdGggcGF0aDsKLQotCXB1YmxpYyBQcm9jZXNzb3JKYXIoSVBhdGggcGF0aCkKLQl7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCi0JcHVibGljIFVSTCBhc1VSTCgpCi0JewotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCS8vIGZpcnN0IHRyeSB0byByZXNvbHZlIGFzIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoCi0JCQlJUGF0aCByb290UGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJvb3RQYXRoLmFwcGVuZChwYXRoKS50b09TU3RyaW5nKCkpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJdXJsID0gZmlsZS50b1VSTCgpOwotCQkJZWxzZQotCQkJewotCQkJCS8vIG5vdyB0cnkgdG8gcmVzb2x2ZSBhcyBhbiBhYnNvbHV0ZSBwYXRoCi0JCQkJZmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKLQkJCQl1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFBhdGgoKQotCXsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3NvclByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9Qcm9jZXNzb3JQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTNkMGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3NvclByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JQcmVmZXJlbmNlcwotewotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRQcm9jZXNzb3JJZDsKLQlwcml2YXRlIExpc3Q8SVByb2Nlc3Nvckluc3RhbGw+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPigpOwotCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc29ycyhMaXN0PElQcm9jZXNzb3JJbnN0YWxsPiBwcm9jZXNzb3JzKQotCXsKLQkJdGhpcy5wcm9jZXNzb3JzID0gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gZ2V0UHJvY2Vzc29ycygpCi0JewotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQcm9jZXNzb3JJZCgpCi0JewotCQlyZXR1cm4gZGVmYXVsdFByb2Nlc3NvcklkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRQcm9jZXNzb3JJZChTdHJpbmcgZGVmYXVsdFByb2Nlc3NvcklkKQotCXsKLQkJdGhpcy5kZWZhdWx0UHJvY2Vzc29ySWQgPSBkZWZhdWx0UHJvY2Vzc29ySWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBc1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmNyZWF0ZUVsZW1lbnQoInByb2Nlc3NvclNldHRpbmdzIik7ICAvLyROT04tTkxTLTEkCi0JCWRvYy5hcHBlbmRDaGlsZChjb25maWcpOwotCi0JCS8vIFNldCB0aGUgZGVmYXVsdFZNIGF0dHJpYnV0ZSBvbiB0aGUgdG9wLWxldmVsIG5vZGUKLQkJaWYgKGRlZmF1bHRQcm9jZXNzb3JJZCAhPSBudWxsKQotCQl7Ci0JCQljb25maWcuc2V0QXR0cmlidXRlKCJkZWZhdWx0UHJvY2Vzc29yIiwgZGVmYXVsdFByb2Nlc3NvcklkKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoSXRlcmF0b3I8SVByb2Nlc3Nvckluc3RhbGw+IGl0ZXIgPSBwcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IChJUHJvY2Vzc29ySW5zdGFsbCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWluc3RhbGwuaXNDb250cmlidXRlZCgpKQotCQkJewotCQkJCUVsZW1lbnQgdm1UeXBlRWxlbWVudCA9IGluc3RhbGxBc0VsZW1lbnQoZG9jLCBpbnN0YWxsKTsKLQkJCQljb25maWcuYXBwZW5kQ2hpbGQodm1UeXBlRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXJpYWxpemUgdGhlIERvY3VtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBTdHJpbmcKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzb3JQcmVmZXJlbmNlcyBmcm9tWE1MKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJUHJvY2Vzc29yUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgUHJvY2Vzc29yUHJlZmVyZW5jZXMoKTsKLQotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7Ci0JCUVsZW1lbnQgY29uZmlnID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCS8vIFBvcHVsYXRlIHRoZSBkZWZhdWx0IFZNLXJlbGF0ZWQgZmllbGRzCi0JCXByZWZzLnNldERlZmF1bHRQcm9jZXNzb3JJZChjb25maWcuZ2V0QXR0cmlidXRlKCJkZWZhdWx0UHJvY2Vzc29yIikpOyAvLyROT04tTkxTLTEkCi0KLQkJTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gcHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8SVByb2Nlc3Nvckluc3RhbGw+KCk7Ci0JCS8vIFRyYXZlcnNlIHRoZSBwYXJzZWQgc3RydWN0dXJlIGFuZCBwb3B1bGF0ZSB0aGUgVk1UeXBlIHRvIFZNIE1hcAotCQlFbGVtZW50W10gcHJvY2Vzc29yRWxzID0gUHJlZmVyZW5jZVV0aWwuZ2V0Q2hpbGRFbGVtZW50cyhjb25maWcsICJwcm9jZXNzb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvckVscy5sZW5ndGg7ICsraSkKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGwgcHJvY2Vzc29yID0gZWxlbWVudEFzSW5zdGFsbChwcm9jZXNzb3JFbHNbaV0pOwotCQkJcHJvY2Vzc29ycy5hZGQocHJvY2Vzc29yKTsKLQkJfQotCi0JCXByZWZzLnNldFByb2Nlc3NvcnMocHJvY2Vzc29ycyk7Ci0KLQkJcmV0dXJuIHByZWZzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsIGVsZW1lbnRBc0luc3RhbGwoRWxlbWVudCBwYXJlbnQpCi0JewotCQlTdHJpbmcgaWQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsYWJlbCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHR5cGVJZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3VwcG9ydHMgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJzdXBwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWJ1Z2dlcklkID0gcGFyZW50LmdldEF0dHJpYnV0ZSgiZGVidWdnZXJJZCIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVByb2Nlc3NvckphcltdIGphcnMgPSBudWxsOwotCQlFbGVtZW50W10gamFyc0VscyA9IFByZWZlcmVuY2VVdGlsLmdldENoaWxkRWxlbWVudHMocGFyZW50LCAiamFycyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChqYXJzRWxzLmxlbmd0aCA9PSAxKQotCQl7Ci0JCQlqYXJzID0gZWxlbWVudEFzSmFycyhqYXJzRWxzWzBdKTsKLQkJfQotCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gbmV3IFByb2Nlc3Nvckluc3RhbGwoaWQsIGxhYmVsLCB0eXBlSWQsIGphcnMsIGRlYnVnZ2VySWQsIHN1cHBvcnRzLCBmYWxzZSk7Ci0JCXJldHVybiBpbnN0YWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgaW5zdGFsbEFzRWxlbWVudChEb2N1bWVudCBkb2MsIElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCi0JewotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicHJvY2Vzc29yIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImlkIiwgaW5zdGFsbC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgibGFiZWwiLCBpbnN0YWxsLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgic3VwcG9ydHMiLCBpbnN0YWxsLmdldFN1cHBvcnRzKCkpOyAvLyROT04tTkxTLTEkCi0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJkZWJ1Z2dlcklkIiwgaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwgPyBpbnN0YWxsLmdldERlYnVnZ2VyKCkuZ2V0SWQoKSA6IG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoamFyc0FzRWxlbWVudChkb2MsIGluc3RhbGwuZ2V0UHJvY2Vzc29ySmFycygpKSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQcm9jZXNzb3JKYXJbXSBlbGVtZW50QXNKYXJzKEVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCUVsZW1lbnRbXSBqYXJFbHMgPSBQcmVmZXJlbmNlVXRpbC5nZXRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsICJqYXIiKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0PFByb2Nlc3Nvckphcj4gamFycyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzc29ySmFyPihqYXJFbHMubGVuZ3RoKTsKLQkJZm9yIChFbGVtZW50IGphckVsIDogamFyRWxzKQotCQl7Ci0JCQlOb2RlIG5vZGUgPSBqYXJFbC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCXsKLQkJCQlTdHJpbmcgcGF0aCA9ICgoVGV4dCkgbm9kZSkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJamFycy5hZGQobmV3IFByb2Nlc3NvckphcihQYXRoLmZyb21Qb3J0YWJsZVN0cmluZyhwYXRoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSVByb2Nlc3NvckphcltdKSBqYXJzLnRvQXJyYXkobmV3IElQcm9jZXNzb3JKYXJbMF0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgamFyc0FzRWxlbWVudChEb2N1bWVudCBkb2MsIElQcm9jZXNzb3JKYXJbXSBqYXJzKQotCXsKLQkJRWxlbWVudCBqYXJzRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiamFycyIpOyAgLy8kTk9OLU5MUy0xJAotCQlmb3IgKElQcm9jZXNzb3JKYXIgamFyIDogamFycykKLQkJewotCQkJaWYgKGphciAhPSBudWxsICYmIGphci5nZXRQYXRoKCkgIT0gbnVsbCkKLQkJCXsKLQkJCQlFbGVtZW50IGphckVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImphciIpOyAvLyROT04tTkxTLTEkCi0JCQkJVGV4dCB0ZXh0ID0gZG9jLmNyZWF0ZVRleHROb2RlKGphci5nZXRQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQlqYXJFbC5hcHBlbmRDaGlsZCh0ZXh0KTsKLQkJCQlqYXJzRWwuYXBwZW5kQ2hpbGQoamFyRWwpOwotCQkJfQotCQl9Ci0JCXJldHVybiBqYXJzRWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJvY2Vzc29yVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvUHJvY2Vzc29yVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjI4OWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1Byb2Nlc3NvclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSU91dHB1dFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yVHlwZSBpbXBsZW1lbnRzIElQcm9jZXNzb3JUeXBlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NfU1VGRklYID0gIi5ERVNDIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NVRkZJWCA9ICIuVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHJhbnNGYWN0b3J5TmFtZTsKLQlwcml2YXRlIGZpbmFsIFVSTCBmZWF0dXJlUHJvcGVydGllc1VSTDsKLQlwcml2YXRlIGZpbmFsIFVSTCBvdXRwdXRQcm9wZXJ0aWVzVVJMOwotCi0JcHJpdmF0ZSBJRmVhdHVyZVtdIGZlYXR1cmVzOwotCXByaXZhdGUgSU91dHB1dFByb3BlcnR5W10gb3V0cHV0UHJvcGVydGllczsKLQlwcml2YXRlIFByb3BlcnRpZXMgb3V0cHV0UHJvcGVydHlWYWx1ZXM7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXM7Ci0KLQlwdWJsaWMgUHJvY2Vzc29yVHlwZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBVUkwgZmVhdHVyZVByb3BlcnRpZXNVUkwsIFVSTCBvdXRwdXRQcm9wZXJ0aWVzVVJMLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVWYWx1ZXMsIFByb3BlcnRpZXMgb3V0cHV0UHJvcGVydHlWYWx1ZXMsIFN0cmluZyB0cmFuc0ZhY3RvcnlOYW1lKQotCXsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZlYXR1cmVQcm9wZXJ0aWVzVVJMID0gZmVhdHVyZVByb3BlcnRpZXNVUkw7Ci0JCXRoaXMub3V0cHV0UHJvcGVydGllc1VSTCA9IG91dHB1dFByb3BlcnRpZXNVUkw7Ci0JCXRoaXMuZmVhdHVyZVZhbHVlcyA9IGZlYXR1cmVWYWx1ZXM7Ci0JCXRoaXMudHJhbnNGYWN0b3J5TmFtZSA9IHRyYW5zRmFjdG9yeU5hbWU7Ci0JCXRoaXMub3V0cHV0UHJvcGVydHlWYWx1ZXMgPSBvdXRwdXRQcm9wZXJ0eVZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEZlYXR1cmVWYWx1ZXMoKQotCXsKLQkJcmV0dXJuIGZlYXR1cmVWYWx1ZXM7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlW10gZ2V0RmVhdHVyZXMoKQotCXsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCXsKLQkJCWlmIChmZWF0dXJlUHJvcGVydGllc1VSTCAhPSBudWxsKQotCQkJCWZlYXR1cmVzID0gbG9hZEZlYXR1cmVzKCk7Ci0JCQllbHNlCi0JCQkJZmVhdHVyZXMgPSBuZXcgSUZlYXR1cmVbMF07Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE91dHB1dFByb3BlcnR5VmFsdWVzKCkKLQl7Ci0JCXJldHVybiBvdXRwdXRQcm9wZXJ0eVZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0pSRURlZmF1bHQoKQotCXsKLQkJcmV0dXJuIFhTTFRSdW50aW1lLkpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lELmVxdWFscyhpZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUcmFuc2Zvcm1lckZhY3RvcnlOYW1lKCkKLQl7Ci0JCXJldHVybiB0cmFuc0ZhY3RvcnlOYW1lOwotCX0KLQotCXB1YmxpYyBJT3V0cHV0UHJvcGVydHlbXSBnZXRPdXRwdXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChvdXRwdXRQcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCWlmIChvdXRwdXRQcm9wZXJ0aWVzVVJMICE9IG51bGwpCi0JCQkJb3V0cHV0UHJvcGVydGllcyA9IGxvYWRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0JCQllbHNlCi0JCQkJb3V0cHV0UHJvcGVydGllcyA9IG5ldyBJT3V0cHV0UHJvcGVydHlbMF07Ci0JCX0KLQkJcmV0dXJuIG91dHB1dFByb3BlcnRpZXM7Ci0JfQotCi0JcHJpdmF0ZSBJT3V0cHV0UHJvcGVydHlbXSBsb2FkT3V0cHV0UHJvcGVydGllcygpCi0JewotCQlCdWZmZXJlZElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJTGlzdDxPdXRwdXRQcm9wZXJ0eT4gb3V0cHV0cyA9IG5ldyBBcnJheUxpc3Q8T3V0cHV0UHJvcGVydHk+KCk7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkKLQkJewotCi0JCQlpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG91dHB1dFByb3BlcnRpZXNVUkwub3BlblN0cmVhbSgpKTsKLQkJCXByb3BzLmxvYWQoaXMpOwotCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHByb3BzLmtleVNldCgpKQotCQkJewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbGVtZW50OwotCQkJCWlmICgha2V5LmVuZHNXaXRoKERFU0NfU1VGRklYKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyBuYW1lID0ga2V5OwotCQkJCQlTdHJpbmcgdXJpID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQkJU3RyaW5nIGRlc2MgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyBERVNDX1NVRkZJWCk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwgJiYgZGVzYyAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlPdXRwdXRQcm9wZXJ0eSBwcm9wID0gbmV3IE91dHB1dFByb3BlcnR5KHVyaS50cmltKCksIGRlc2MpOwotCQkJCQkJb3V0cHV0cy5hZGQocHJvcCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBNZXNzYWdlcy5nZXRTdHJpbmcoIlByb2Nlc3NvclR5cGUuMiIpICsgb3V0cHV0UHJvcGVydGllc1VSTCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9jZXNzb3JUeXBlLjMiKSArIGtleSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJaWYgKGlzICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSU91dHB1dFByb3BlcnR5W10pIG91dHB1dHMudG9BcnJheShuZXcgSU91dHB1dFByb3BlcnR5WzBdKTsKLQl9Ci0KLQlwcml2YXRlIElGZWF0dXJlW10gbG9hZEZlYXR1cmVzKCkKLQl7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlMaXN0PEZlYXR1cmU+IGZlYXR1cmVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmVhdHVyZT4oKTsKLQkJdHJ5Ci0JCXsKLQkJCWlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmVhdHVyZVByb3BlcnRpZXNVUkwub3BlblN0cmVhbSgpKTsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcHJvcHMubG9hZChpcyk7Ci0KLQkJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBwcm9wcy5rZXlTZXQoKSkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZWxlbWVudDsKLQkJCQlpZiAoIWtleS5lbmRzV2l0aChERVNDX1NVRkZJWCkgJiYgIWtleS5lbmRzV2l0aChUWVBFX1NVRkZJWCkpCi0JCQkJewotCQkJCQlTdHJpbmcgdXJpID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQkJU3RyaW5nIHR5cGUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyBUWVBFX1NVRkZJWCk7Ci0JCQkJCVN0cmluZyBkZXNjID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgREVTQ19TVUZGSVgpOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdHlwZSAhPSBudWxsICYmIGRlc2MgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJRmVhdHVyZSBmZWF0dXJlID0gbmV3IEZlYXR1cmUodXJpLnRyaW0oKSwgdHlwZS50cmltKCksIGRlc2MpOwotCQkJCQkJZmVhdHVyZXNMaXN0LmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2cobmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIE1lc3NhZ2VzLmdldFN0cmluZygiUHJvY2Vzc29yVHlwZS40IikgKyBmZWF0dXJlUHJvcGVydGllc1VSTCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9jZXNzb3JUeXBlLjUiKSArIGtleSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IChJRmVhdHVyZVtdKSBmZWF0dXJlc0xpc3QudG9BcnJheShuZXcgSUZlYXR1cmVbMF0pOwotCQlBcnJheXMuc29ydChmZWF0dXJlcyk7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZmIyZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBVdGlscwotewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUxvY2F0aW9uKFN0cmluZyBidW5kbGVJZCwgU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQl0cnkKLQkJewotCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGJ1bmRsZUlkKSwgbmV3IFBhdGgocGF0aCksIG51bGwpOwotCQkJaWYgKHVybCAhPSBudWxsKQotCQkJewotCQkJCVVSTCBmaWxlVXJsID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHVybCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVVybC5nZXRGaWxlKCkpOwotCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlV0aWxzLjAiKSArIHBhdGggKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlV0aWxzLjEiKSArIGJ1bmRsZUlkLCBlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IAotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luTG9jYXRpb24oU3RyaW5nIGJ1bmRsZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKCJwbGF0Zm9ybTovcGx1Z2luLyIrYnVuZGxlSWQpOwotCQkJaWYgKHVybCAhPSBudWxsKQotCQkJewotCQkJCVVSTCBmaWxlVXJsID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHVybCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVVybC5nZXRGaWxlKCkpOwotCQkJCWxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlV0aWxzLjAiKSArIGJ1bmRsZUlkICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJVdGlscy4xIikgKyBidW5kbGVJZCwgZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSAKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMUHJvcGVydHlUZXN0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGQ2YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLQotcHVibGljIGNsYXNzIFhTTFByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIKLXsKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCBhcmcwLCBTdHJpbmcgYXJnMSwgT2JqZWN0W10gYXJnMiwgT2JqZWN0IGFyZzMpCi0JewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjU0ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLkVGUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JRGVidWdFdmVudFNldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhTGF1bmNoRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JRGVidWdnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3Nvckludm9rZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSVByb2Nlc3NvckphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwuSVhTTENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbC5YU0xEZWJ1Z1RhcmdldDsKLQotcHVibGljIGNsYXNzIFhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBKYXZhTGF1bmNoRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVidWdFdmVudFNldExpc3RlbmVyCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbW9kZTsKLQlwcml2YXRlIExhdW5jaEhlbHBlciBsYXVuY2hIZWxwZXI7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBYU0xEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgaW1wbGVtZW50cyBJRGVidWdFdmVudFNldExpc3RlbmVyCi0JewotCQlwcml2YXRlIElMYXVuY2ggbGF1bmNoOwotCi0JCXB1YmxpYyBYU0xEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIoSUxhdW5jaCBsYXVuY2gpCi0JCXsKLQkJCXRoaXMubGF1bmNoID0gbGF1bmNoOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKQotCQl7Ci0JCQlpZiAobGF1bmNoLmdldFByb2Nlc3NlcygpLmxlbmd0aCA+IDApCi0JCQl7Ci0JCQkJZm9yIChEZWJ1Z0V2ZW50IGRlYnVnRXZlbnQgOiBldmVudHMpCi0JCQkJewotCQkJCQlpZiAoZGVidWdFdmVudC5nZXRTb3VyY2UoKSA9PSBsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0gJiYgZGVidWdFdmVudC5nZXRLaW5kKCkgPT0gRGVidWdFdmVudC5URVJNSU5BVEUpCi0JCQkJCXsKLQkJCQkJCS8vIHJlbW92ZSBzZWxmIGFzIGxpc3RlbmVyCi0JCQkJCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCQkJCQkJRmlsZSBmaWxlID0gbGF1bmNoSGVscGVyLmdldFRhcmdldCgpOwotCQkJCQkJSUZpbGUgaWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJCQlpZiAoaWZpbGUgIT0gbnVsbCkKLQkJCQkJCXsvLyByZWZyZXNoIHRoaXMgd29ya3NwYWNlIGZpbGUuLgotCQkJCQkJCXRyeQotCQkJCQkJCXsKLQkJCQkJCQkJaWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpewotCQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBkb25lKCkKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQlvcGVuRmlsZUlmUmVxdWlyZWQoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJCQkJewotCQkJCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlvcGVuRmlsZUlmUmVxdWlyZWQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBvcGVuRmlsZUlmUmVxdWlyZWQoKQotCQl7Ci0JCQkvLyBUT0RPIHRoaXMgaXMgZGlydHkgLSBuZWVkIHRvIGRlY2xhcmUgZXh0ZW5zaW9uIHBvaW50IGFuZCBtb3ZlIHRoZSBVSSBjb2RlIGludG8gdGhlIFVJIHBsdWdpbgotCQkJaWYgKGxhdW5jaEhlbHBlci5nZXRPcGVuRmlsZU9uQ29tcGxldGlvbigpKQotCQkJewotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCXsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkKLQkJCQkJewotCQkJCQkJLy8gT3BlbiBlZGl0b3Igb24gbmV3IGZpbGUuCi0JCQkJCQlJV29ya2JlbmNoV2luZG93IGR3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQkJCXRyeQotCQkJCQkJewotCQkJCQkJCUZpbGUgZmlsZSA9IGxhdW5jaEhlbHBlci5nZXRUYXJnZXQoKTsKLQkJCQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCQlJRmlsZVN0b3JlIGZpbGVzdG9yZSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShwYXRoKTsKLQkJCQkJCQlJREUub3BlbkVkaXRvck9uRmlsZVN0b3JlKGR3LmdldEFjdGl2ZVBhZ2UoKSwgZmlsZXN0b3JlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQotCQkJCQkJewotCQkJCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgZmluYWwgU3RyaW5nIG1vZGUsIGZpbmFsIElMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQl0aGlzLm1vZGUgPSBtb2RlOwotCQlsYXVuY2hIZWxwZXIgPSBuZXcgTGF1bmNoSGVscGVyKGNvbmZpZ3VyYXRpb24pOwotCQlsYXVuY2hIZWxwZXIuc2F2ZShnZXRMYXVuY2hDb25maWdGaWxlKCkpOwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKG5ldyBYU0xEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIobGF1bmNoKSk7Ci0KLQkJLy8gdGhlIHN1cGVyLmxhdW5jaCB3aWxsIGFkZCBhIEphdmEgc291cmNlIGRpcmVjdG9yIGlmIHdlIHNldCBpdCB0byBudWxsIGhlcmUKLQkJZmluYWwgSVNvdXJjZUxvY2F0b3IgY29uZmlndXJlZExvY2F0b3IgPSBsYXVuY2guZ2V0U291cmNlTG9jYXRvcigpOwotCQlsYXVuY2guc2V0U291cmNlTG9jYXRvcihudWxsKTsKLQotCQlzdXBlci5sYXVuY2goY29uZmlndXJhdGlvbiwgbW9kZSwgbGF1bmNoLCBtb25pdG9yKTsKLQkJCi0JCS8vIG5vdyBnZXQgdGhlIGphdmEgc291cmNlIGxvY2F0b3IKLQkJZmluYWwgSVNvdXJjZUxvY2F0b3IgamF2YVNvdXJjZUxvb2t1cERpcmVjdG9yID0gKElTb3VyY2VMb2NhdG9yKWxhdW5jaC5nZXRTb3VyY2VMb2NhdG9yKCk7Ci0JCS8vIG5vdyBhZGQgb3VyIG93biBwYXJ0aWNpcGFudCB0byB0aGUgamF2YSBkaXJlY3RvcgotCQlsYXVuY2guc2V0U291cmNlTG9jYXRvcihuZXcgSVNvdXJjZUxvY2F0b3IoKXsKLQotCQkJcHVibGljIE9iamVjdCBnZXRTb3VyY2VFbGVtZW50KElTdGFja0ZyYW1lIHN0YWNrRnJhbWUpIAotCQkJewotCQkJCS8vIHNpbXBseSBsb29rIGF0IG9uZSBhbmQgdGhlbiB0aGUgb3RoZXIKLQkJCQlPYmplY3Qgc291cmNlRWxlbWVudCA9IGphdmFTb3VyY2VMb29rdXBEaXJlY3Rvci5nZXRTb3VyY2VFbGVtZW50KHN0YWNrRnJhbWUpOwotCQkJCWlmIChzb3VyY2VFbGVtZW50ID09IG51bGwpCi0JCQkJCXNvdXJjZUVsZW1lbnQgPSBjb25maWd1cmVkTG9jYXRvci5nZXRTb3VyY2VFbGVtZW50KHN0YWNrRnJhbWUpOwotCQkJCXJldHVybiBzb3VyY2VFbGVtZW50OwotCQkJfX0pOwotCQkKLS8vCQlJSmF2YURlYnVnVGFyZ2V0IGphdmFUYXJnZXQgPSAoSUphdmFEZWJ1Z1RhcmdldClsYXVuY2guZ2V0RGVidWdUYXJnZXQoKTsKLS8vCQlsYXVuY2gucmVtb3ZlRGVidWdUYXJnZXQoamF2YVRhcmdldCk7Ci0JCQotCQlJRGVidWdUYXJnZXQgamF2YVRhcmdldCA9IGxhdW5jaC5nZXREZWJ1Z1RhcmdldCgpOwotCQlJRGVidWdUYXJnZXQgeHNsVGFyZ2V0ID0gbmV3IFhTTERlYnVnVGFyZ2V0KGxhdW5jaCwgbGF1bmNoLmdldFByb2Nlc3NlcygpWzBdLCBsYXVuY2hIZWxwZXIpOwotCQkKLQkJLy8gcmVtb3ZlIGphdmEgYXMgdGhlIHByaW1hcnkgdGFyZ2V0IGFuZCBtYWtlIHhzbCB0aGUgcHJpbWFyeSB0YXJnZXQKLQkJbGF1bmNoLnJlbW92ZURlYnVnVGFyZ2V0KGphdmFUYXJnZXQpOwotCQlsYXVuY2guYWRkRGVidWdUYXJnZXQoeHNsVGFyZ2V0KTsKLQkJLy8gYWRkIHRoaXMgaGVyZSB0byBtYWtlIGphdmEgdGhlIG5vbi1wcmltYXJ5IHRhcmdldAotCS8vCWxhdW5jaC5hZGREZWJ1Z1RhcmdldChqYXZhVGFyZ2V0KTsKLQkJCi0JLy8JbGF1bmNoLmFkZERlYnVnVGFyZ2V0KG5ldyBKYXZhWFNMRGVidWdUYXJnZXQobGF1bmNoLCBsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0sIGxhdW5jaEhlbHBlciwgamF2YVRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgSmF2YSBicmVha3BvaW50IGFuZCB0aGUgWFNMIGJyZWFrcG9pbnRzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gZ2V0QnJlYWtwb2ludHMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikKLQl7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlpZiAoIWJyZWFrcG9pbnRNYW5hZ2VyLmlzRW5hYmxlZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJQnJlYWtwb2ludFtdIGphdmFCcmVha3BvaW50cyA9IHN1cGVyLmdldEJyZWFrcG9pbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlJQnJlYWtwb2ludFtdIHhzbEJyZWFrcG9pbnRzID0gYnJlYWtwb2ludE1hbmFnZXIuZ2V0QnJlYWtwb2ludHMoSVhTTENvbnN0YW50cy5JRF9YU0xfREVCVUdfTU9ERUwpOwotCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gbmV3IElCcmVha3BvaW50W2phdmFCcmVha3BvaW50cy5sZW5ndGgreHNsQnJlYWtwb2ludHMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShqYXZhQnJlYWtwb2ludHMsIDAsIGJyZWFrcG9pbnRzLCAwLCBqYXZhQnJlYWtwb2ludHMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh4c2xCcmVha3BvaW50cywgMCwgYnJlYWtwb2ludHMsIGphdmFCcmVha3BvaW50cy5sZW5ndGgsIHhzbEJyZWFrcG9pbnRzLmxlbmd0aCk7Ci0JCQotCQlyZXR1cm4gYnJlYWtwb2ludHM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJlTGF1bmNoQ2hlY2soSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChtb2RlLmVxdWFscyhJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKSkKLQkJewotCQkJZmluYWwgSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbiwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQkJaWYgKGluc3RhbGwuZ2V0RGVidWdnZXIoKSA9PSBudWxsKQotCQkJewotCQkJCWZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltdCi0JCQkJeyBmYWxzZSB9OwotCQkJCS8vIG9wZW4gYSBkaWFsb2cgZm9yIGNob29zaW5nIGEgZGlmZmVyZW50IGluc3RhbGwgdGhhdCBkb2VzIGhhdmUKLQkJCQkvLyBhbiBhc3NvY2lhdGVkIGRlYnVnZ2VyCi0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJCQl7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBkZWJ1Z2dpbmdJbnN0YWxsSWQgPSBMYXVuY2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0RFQlVHR0lOR19JTlNUQUxMX0lEKTsKLQkJCQkJCUlQcm9jZXNzb3JJbnN0YWxsIHByb2Nlc3NvciA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvcihkZWJ1Z2dpbmdJbnN0YWxsSWQpOwotCi0JCQkJCQlJV29ya2JlbmNoV2luZG93IGR3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQkJCQotCQkJCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuMSIpICsgaW5zdGFsbC5nZXROYW1lKCkgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuMiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkrIE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4zIikgKyBwcm9jZXNzb3IuZ2V0TmFtZSgpICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjQiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQotCQkJCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhkdy5nZXRTaGVsbCgpLCB0aXRsZSwgbnVsbCwgbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwgfSwgMCk7IC8vIHllcyBpcyB0aGUgZGVmYXVsdAotCQkJCQkJCi0JCQkJICAgICAgICByZXN1bHRbMF0gPSBkaWFsb2cub3BlbigpID09IDA7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gcmVzdWx0WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5wcmVMYXVuY2hDaGVjayhjb25maWd1cmF0aW9uLCBtb2RlLCBtb25pdG9yKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVZNUnVubmVyIGdldFZNUnVubmVyKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJLy8gY29tbWVudCB0aGlzIG91dCBpbiBvcmRlciB0byBnZXQgamF2YSBkZWJ1Z2dpbmcgYXMgd2VsbCBhcyBYU0wgZGVidWdnaW5nCi0vLwkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotLy8JCQlyZXR1cm4gc3VwZXIuZ2V0Vk1SdW5uZXIoY29uZmlndXJhdGlvbiwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0Vk1SdW5uZXIoY29uZmlndXJhdGlvbiwgbW9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldExhdW5jaENvbmZpZ0ZpbGUoKQotCXsKLQkJSVBhdGggbGF1bmNoUGF0aCA9IFBsYXRmb3JtLmdldFN0YXRlTG9jYXRpb24oTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSkuYXBwZW5kKE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS41IikpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgbGF1bmNoRGlyID0gbGF1bmNoUGF0aC50b0ZpbGUoKTsKLQkJaWYgKCFsYXVuY2hEaXIuZXhpc3RzKCkpCi0JCQlsYXVuY2hEaXIubWtkaXIoKTsKLQkJRmlsZSBmZWF0dXJlc0ZpbGUgPSBuZXcgRmlsZShsYXVuY2hEaXIsIE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS42IikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmZWF0dXJlc0ZpbGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElQYXRoIGdldFdvcmtpbmdEaXJlY3RvcnlQYXRoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgcGF0aCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9DRVNTT1JfV09SS0lOR19ESVIsIChTdHJpbmcpIG51bGwpOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQl7Ci0JCQlwYXRoID0gVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKHBhdGgpOwotCQkJcmV0dXJuIG5ldyBQYXRoKHBhdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVByb2Nlc3Nvckludm9rZXIgZ2V0UHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVN0cmluZyBpbnZva2VySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklOVk9LRVJfREVTQ1JJUFRPUiwgKFN0cmluZykgbnVsbCk7Ci0JCWlmIChpbnZva2VySWQgPT0gbnVsbCkKLQkJCWludm9rZXJJZCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwLmludm9rZSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIFhTTFRSdW50aW1lLmdldFByb2Nlc3Nvckludm9rZXIoaW52b2tlcklkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsIGdldFByb2Nlc3Nvckluc3RhbGwoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsOwotCQlib29sZWFuIHVzZURlZmF1bHRQcm9jZXNzb3IgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB0cnVlKTsKLQkJaWYgKHVzZURlZmF1bHRQcm9jZXNzb3IpCi0JCXsKLQkJCWluc3RhbGwgPSBYU0xUUnVudGltZS5nZXREZWZhdWx0UHJvY2Vzc29yKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlTdHJpbmcgcHJvY2Vzc29ySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbGwgPSBYU0xUUnVudGltZS5nZXRQcm9jZXNzb3IocHJvY2Vzc29ySWQpOwotCQl9Ci0JCWlmIChtb2RlLmVxdWFscyhJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKSAmJiBpbnN0YWxsLmdldERlYnVnZ2VyKCkgPT0gbnVsbCkKLQkJewotCQkJU3RyaW5nIGRlYnVnZ2luZ0luc3RhbGxJZCA9IExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFRkFVTFRfREVCVUdHSU5HX0lOU1RBTExfSUQpOwotCQkJaW5zdGFsbCA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvcihkZWJ1Z2dpbmdJbnN0YWxsSWQpOwotCQl9Ci0JCXJldHVybiBpbnN0YWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpblR5cGVOYW1lKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuRGVidWdSdW5uZXIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLk1haW4iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvLyBjbGFzc25hbWUsIHNvdXJjZXVybCwgb3V0cHV0IGZpbGUKLQkJSVByb2Nlc3Nvckludm9rZXIgaW52b2tlciA9IGdldFByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmcgY2xhenogPSBpbnZva2VyLmdldEludm9rZXJDbGFzc05hbWUoKTsKLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChjbGF6eik7Ci0JCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCgiXCIiICsgZ2V0TGF1bmNoQ29uZmlnRmlsZSgpLmdldEFic29sdXRlUGF0aCgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoIlwiIiArIGxhdW5jaEhlbHBlci5nZXRTb3VyY2UoKSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKCJcIiIgKyBsYXVuY2hIZWxwZXIuZ2V0VGFyZ2V0KCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJewotCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbiwgbW9kZSk7Ci0JCQlpZiAoaW5zdGFsbC5nZXREZWJ1Z2dlcigpICE9IG51bGwpCi0JCQl7Ci0JCQkJSURlYnVnZ2VyIGRlYnVnZ2VyID0gaW5zdGFsbC5nZXREZWJ1Z2dlcigpOwotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBkZWJ1Z2dlci5nZXRDbGFzc05hbWUoKTsKLQkJCQlzYi5hcHBlbmQoIiAtZGVidWcgIikuYXBwZW5kKGNsYXNzTmFtZSkuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXNiLmFwcGVuZChsYXVuY2hIZWxwZXIuZ2V0UmVxdWVzdFBvcnQoKSkuYXBwZW5kKCIgIikuYXBwZW5kKGxhdW5jaEhlbHBlci5nZXRFdmVudFBvcnQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc3BhdGgoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCS8vIGdldCB0aGUgY2xhc3NwYXRoIGRlZmluZWQgYnkgdGhlIHVzZXIKLQkJU3RyaW5nW10gdXNlckNsYXNzcGF0aCA9IHN1cGVyLmdldENsYXNzcGF0aChjb25maWd1cmF0aW9uKTsKLQotCQkvLyBnZXQgdGhlIGNsYXNzcGF0aCByZXF1aXJlZCBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uCi0JCUlQcm9jZXNzb3JJbnZva2VyIGludm9rZXIgPSBnZXRQcm9jZXNzb3JJbnZva2VyRGVzY3JpcHRvcihjb25maWd1cmF0aW9uKTsKLQkJTGlzdDxTdHJpbmc+IGludm9rZXJDUCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBlbnRyeSA6IGludm9rZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpKQotCQl7Ci0JCQlpbnZva2VyQ1AuYWRkKGVudHJ5KTsKLQkJfQotCi0JCS8vIGFkZCB0aGUgZGVidWdnZXIuLi4KLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbiwgbW9kZSk7Ci0JCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSAmJiBpbnN0YWxsLmdldERlYnVnZ2VyKCkgIT0gbnVsbCkKLQkJewotCQkJU3RyaW5nW10gamFycyA9IGluc3RhbGwuZ2V0RGVidWdnZXIoKS5nZXRDbGFzc1BhdGgoKTsKLQkJCWZvciAoU3RyaW5nIGphciA6IGphcnMpCi0JCQl7Ci0JCQkJaW52b2tlckNQLmFkZChqYXIpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gaW52b2tlckNsYXNzcGF0aCA9IChTdHJpbmdbXSkgaW52b2tlckNQLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0KLQkJLy8gYWRkIHRoZW0gdG9nZXRoZXIKLQkJU3RyaW5nW10gY2xhc3NwYXRoID0gbmV3IFN0cmluZ1t1c2VyQ2xhc3NwYXRoLmxlbmd0aCArIGludm9rZXJDbGFzc3BhdGgubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShpbnZva2VyQ2xhc3NwYXRoLCAwLCBjbGFzc3BhdGgsIDAsIGludm9rZXJDbGFzc3BhdGgubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh1c2VyQ2xhc3NwYXRoLCAwLCBjbGFzc3BhdGgsIGludm9rZXJDbGFzc3BhdGgubGVuZ3RoLCB1c2VyQ2xhc3NwYXRoLmxlbmd0aCk7Ci0KLQkJcmV0dXJuIGNsYXNzcGF0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFZNQXJndW1lbnRzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgdm1hcmdzID0gc3VwZXIuZ2V0Vk1Bcmd1bWVudHMoY29uZmlndXJhdGlvbik7Ci0KLQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbiwgbW9kZSk7Ci0JCWlmIChpbnN0YWxsICE9IG51bGwgJiYgIWluc3RhbGwuZ2V0UHJvY2Vzc29yVHlwZSgpLmlzSlJFRGVmYXVsdCgpKQotCQl7Ci0JCQkvLyBjbGVhciB0aGUgZW5kb3JzZWQgZGlyCi0JCQlGaWxlIHRlbXBEaXIgPSBnZXRFbmRvcnNlZERpcigpOwotCQkJaWYgKHRlbXBEaXIuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJRmlsZVtdIGNoaWxkcmVuID0gdGVtcERpci5saXN0RmlsZXMoKTsKLQkJCQlmb3IgKEZpbGUgY2hpbGQgOiBjaGlsZHJlbikKLQkJCQl7Ci0JCQkJCWNoaWxkLmRlbGV0ZSgpOwotCQkJCX0KLQkJCQl0ZW1wRGlyLmRlbGV0ZSgpOwotCQkJfQotCQkJdGVtcERpci5ta2RpcigpOwotCi0JCQkvLyBtb3ZlIHRoZSByZXF1aXJlZCBqYXJzIHRvIHRoZSBlbmRvcnNlZCBkaXIKLQkJCUlQcm9jZXNzb3JKYXJbXSBqYXJzID0gaW5zdGFsbC5nZXRQcm9jZXNzb3JKYXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGphcnMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJVVJMIGVudHJ5ID0gamFyc1tpXS5hc1VSTCgpOwotCQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4yMyIpICsgamFyc1tpXSwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodGVtcERpciwgIkVORF8iICsgaSArICIuamFyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW1vdmVGaWxlKGVudHJ5LCBmaWxlKTsKLQkJCX0KLQkJCS8vIGFkZCB0aGUgZW5kb3JzZWQgZGlyCi0JCQl2bWFyZ3MgKz0gIiAtRGphdmEuZW5kb3JzZWQuZGlycz1cIiIgKyB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgdGZhY3RvcnkgPSBpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5nZXRUcmFuc2Zvcm1lckZhY3RvcnlOYW1lKCk7Ci0JCQlpZiAodGZhY3RvcnkgIT0gbnVsbCkKLQkJCQl2bWFyZ3MgKz0gIiAtRGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5PSIgKyBpbnN0YWxsLmdldFByb2Nlc3NvclR5cGUoKS5nZXRUcmFuc2Zvcm1lckZhY3RvcnlOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdm1hcmdzOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRFbmRvcnNlZERpcigpCi0JewotCQlJUGF0aCB0ZW1wTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpLmFwcGVuZCgiZW5kb3JzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdGVtcExvY2F0aW9uLnRvRmlsZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbW92ZUZpbGUoVVJMIHNyYywgRmlsZSB0YXJnZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBudWxsOwotCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0KSk7Ci0JCQliaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzcmMub3BlblN0cmVhbSgpKTsKLQkJCXdoaWxlIChiaXMuYXZhaWxhYmxlKCkgPiAwKQotCQkJewotCQkJCWludCBzaXplID0gYmlzLmF2YWlsYWJsZSgpOwotCQkJCWlmIChzaXplID4gMTAyNCkKLQkJCQkJc2l6ZSA9IDEwMjQ7Ci0JCQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCQliaXMucmVhZChiLCAwLCBiLmxlbmd0aCk7Ci0JCQkJYm9zLndyaXRlKGIpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS43IikgKyBzcmMgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuMzEiKSArIHRhcmdldCwgZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWlmIChiaXMgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWJpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGJvcyAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJYm9zLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlTG9va3VwRGlyZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VMb29rdXBEaXJlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTNlNzNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VMb29rdXBEaXJlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5BYnN0cmFjdFNvdXJjZUxvb2t1cERpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VMb29rdXBQYXJ0aWNpcGFudDsKLQotcHVibGljIGNsYXNzIFhTTFRTb3VyY2VMb29rdXBEaXJlY3RvciBleHRlbmRzIEFic3RyYWN0U291cmNlTG9va3VwRGlyZWN0b3IKLXsKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFydGljaXBhbnRzKCkKLQl7Ci0JCWFkZFBhcnRpY2lwYW50cyhuZXcgSVNvdXJjZUxvb2t1cFBhcnRpY2lwYW50W117IG5ldyBYU0xUU291cmNlTG9va3VwUGFydGljaXBhbnQoKSB9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlTG9va3VwUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VMb29rdXBQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTIzMjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VMb29rdXBQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5BYnN0cmFjdFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsLlhTTFN0YWNrRnJhbWU7Ci0KLS8qKgotICogVHJhbnNsYXRlIGEgc3RhY2sgZnJhbWUgaW50byBhIHNvdXJjZSBmaWxlIG5hbWUKLSAqLwotcHVibGljIGNsYXNzIFhTTFRTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCBleHRlbmRzIEFic3RyYWN0U291cmNlTG9va3VwUGFydGljaXBhbnQKLXsKLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoT2JqZWN0IG9iamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0xTdGFja0ZyYW1lKQotCQl7Ci0JCQlyZXR1cm4gKChYU0xTdGFja0ZyYW1lKSBvYmplY3QpLmdldFNvdXJjZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9YU0xUU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmViNjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL1hTTFRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5EaXJlY3RvcnlTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Gb2xkZXJTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Qcm9qZWN0U291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnLkxhdW5jaFBpcGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hUcmFuc2Zvcm07Ci0KLXB1YmxpYyBjbGFzcyBYU0xUU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUKLXsKLQlwdWJsaWMgSVNvdXJjZUNvbnRhaW5lcltdIGNvbXB1dGVTb3VyY2VDb250YWluZXJzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUxpc3Q8SVNvdXJjZUNvbnRhaW5lcj4gY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNvdXJjZUNvbnRhaW5lcj4oKTsKLQotCQlTdHJpbmcgc291cmNlRmlsZUV4cHIgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfSU5QVVRfRklMRSwgKFN0cmluZykgbnVsbCk7Ci0JCUlQYXRoIHNvdXJjZUZpbGUgPSBnZXRTdWJzdGl0dXRlZFBhdGgoc291cmNlRmlsZUV4cHIpOwotCQlMYXVuY2hQaXBlbGluZSBwaXBlbGluZSA9IGh5ZHJhdGVQaXBlbGluZShjb25maWd1cmF0aW9uKTsKLQotCQkvLyBUT0RPIGhhdmUgc29tZSB3YXkgb2Yga25vd2luZyB3aGV0aGVyIGl0IGlzIGFuIElSZXNvdXJjZSBvciBub3QKLQkJY29udGFpbmVycy5hZGQobmV3IERpcmVjdG9yeVNvdXJjZUNvbnRhaW5lcihzb3VyY2VGaWxlLCBmYWxzZSkpOwotCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHBpcGVsaW5lLmdldFRyYW5zZm9ybURlZnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCUxhdW5jaFRyYW5zZm9ybSB0cmFuc2Zvcm0gPSAoTGF1bmNoVHJhbnNmb3JtKSBpdGVyLm5leHQoKTsKLQkJCUlQYXRoIHBhdGggPSB0cmFuc2Zvcm0uZ2V0UGF0aCgpOwotCQkJSVNvdXJjZUNvbnRhaW5lciBzb3VyY2VDb250YWluZXIgPSBudWxsOwotCQkJaWYgKHRyYW5zZm9ybS5nZXRQYXRoVHlwZSgpLmVxdWFscyhMYXVuY2hUcmFuc2Zvcm0uUkVTT1VSQ0VfVFlQRSkpCi0JCQl7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKGNvbnRhaW5lci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQkJewotCQkJCQlzb3VyY2VDb250YWluZXIgPSBuZXcgUHJvamVjdFNvdXJjZUNvbnRhaW5lcigoSVByb2plY3QpIGNvbnRhaW5lciwgZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250YWluZXIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpCi0JCQkJewotCQkJCQlzb3VyY2VDb250YWluZXIgPSBuZXcgRm9sZGVyU291cmNlQ29udGFpbmVyKGNvbnRhaW5lciwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlzb3VyY2VDb250YWluZXIgPSBuZXcgRGlyZWN0b3J5U291cmNlQ29udGFpbmVyKHBhdGgsIGZhbHNlKTsKLQkJCX0KLQkJCWNvbnRhaW5lcnMuYWRkKHNvdXJjZUNvbnRhaW5lcik7Ci0JCX0KLQotCQkvLyBpZiAoc291cmNlQ29udGFpbmVyID09IG51bGwpCi0JCS8vIHsKLQkJLy8gc291cmNlQ29udGFpbmVyID0gbmV3IFdvcmtzcGFjZVNvdXJjZUNvbnRhaW5lcigpOwotCQkvLyB9Ci0KLQkJcmV0dXJuIChJU291cmNlQ29udGFpbmVyW10pIGNvbnRhaW5lcnMudG9BcnJheShuZXcgSVNvdXJjZUNvbnRhaW5lclswXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGF1bmNoUGlwZWxpbmUgaHlkcmF0ZVBpcGVsaW5lKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlMYXVuY2hQaXBlbGluZSBwaXBlbGluZSA9IG51bGw7Ci0JCVN0cmluZyBzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BJUEVMSU5FLCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkKLQkJewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKTsKLQkJCXBpcGVsaW5lID0gTGF1bmNoUGlwZWxpbmUuZnJvbVhNTChpbnB1dFN0cmVhbSk7Ci0JCX0KLQkJcmV0dXJuIHBpcGVsaW5lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldFN1YnN0aXR1dGVkUGF0aChTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCXsKLQkJCXBhdGggPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24ocGF0aCk7Ci0JCQlyZXR1cm4gbmV3IFBhdGgocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwODk4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotRmVhdHVyZS4wPVZhbHVlIG11c3QgYmUgYSBkb3VibGUKLUZlYXR1cmUuMT1WYWx1ZSBtdXN0IGJlIGFuIGludGVnZXIKLUZlYXR1cmUuMj1WYWxpZCB2YWx1ZXMgYXJlICd0cnVlJyBvciAnZmFsc2UnCi1GZWF0dXJlLjU9VmFsdWUgbXVzdCBiZSBhIGZsb2F0Ci1QbHVnaW5Qcm9jZXNzb3JKYXIuMD0sIHBhdGggCi1Qcm9jZXNzb3JUeXBlLjI9T3V0cHV0IHByb3BlcnRpZXMgZmlsZSAKLVByb2Nlc3NvclR5cGUuMz1cIG5vdCBjb25maWd1cmVkIHByb3Blcmx5IGZvciBrZXkgCi1Qcm9jZXNzb3JUeXBlLjQ9RmVhdHVyZSBwcm9wZXJ0aWVzIGZpbGUgCi1Qcm9jZXNzb3JUeXBlLjU9XCBub3QgY29uZmlndXJlZCBwcm9wZXJseSBmb3Iga2V5IAotVXRpbHMuMD1FcnJvciBkZXRlcm1pbmluZyBqYXIgZmlsZSBsb2NhdGlvbjogCi1VdGlscy4xPVwgZnJvbSBidW5kbGU6IAotWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4wPVN3aXRjaCB0byBEZWZhdWx0IERlYnVnZ2VyCi1YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLjE9VGhlIAotWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS4yPVwgWFNMVCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBkZWJ1Z2dpbmcuXG4KLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuMjM9Q291bGQgbm90IGxvY2F0ZSBqYXIgZmlsZSAKLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuMz1Xb3VsZCB5b3UgbGlrZSB0byBkZWJ1ZyB1c2luZyB0aGUgZGVmYXVsdCAKLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuMzE9XCB0byAKLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuND1cIHByb2Nlc3NvciBpbnN0ZWFkPwotWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS41PWxhdW5jaAotWFNMVExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS42PWxhdW5jaC54bWwKLVhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuNz1FcnJvciBjb3B5aW5nIHVybCAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0Fic3RyYWN0UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5OWM1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTGF1bmNoaW5nUGx1Z2luOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KQotCXsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCkgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIkFic3RyYWN0UmVnaXN0cnlSZWFkZXIuMyIpICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCUxhdW5jaGluZ1BsdWdpbi5sb2cobmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBidWYudG9TdHJpbmcoKSwgbnVsbCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0JewotCQlsb2dFcnJvcihlbGVtZW50LCBNZXNzYWdlcy5nZXRTdHJpbmcoIkFic3RyYWN0UmVnaXN0cnlSZWFkZXIuNSIpICsgYXR0cmlidXRlTmFtZSArIE1lc3NhZ2VzLmdldFN0cmluZygiQWJzdHJhY3RSZWdpc3RyeVJlYWRlci42IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nTWlzc2luZ0VsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBlbGVtZW50TmFtZSkKLQl7Ci0JCWxvZ0Vycm9yKGVsZW1lbnQsIE1lc3NhZ2VzLmdldFN0cmluZygiQWJzdHJhY3RSZWdpc3RyeVJlYWRlci43IikgKyBlbGVtZW50TmFtZSArIE1lc3NhZ2VzLmdldFN0cmluZygiQWJzdHJhY3RSZWdpc3RyeVJlYWRlci44IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nVW5rbm93bkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQlsb2dFcnJvcihlbGVtZW50LCBNZXNzYWdlcy5nZXRTdHJpbmcoIkFic3RyYWN0UmVnaXN0cnlSZWFkZXIuOSIpICsgZWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBJRXh0ZW5zaW9uW10gb3JkZXJFeHRlbnNpb25zKElFeHRlbnNpb25bXSBleHRlbnNpb25zKQotCXsKLQkJSUV4dGVuc2lvbltdIHNvcnRlZEV4dGVuc2lvbiA9IG5ldyBJRXh0ZW5zaW9uW2V4dGVuc2lvbnMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShleHRlbnNpb25zLCAwLCBzb3J0ZWRFeHRlbnNpb24sIDAsIGV4dGVuc2lvbnMubGVuZ3RoKTsKLQkJQ29tcGFyYXRvcjxJRXh0ZW5zaW9uPiBjb21wYXJlciA9IG5ldyBDb21wYXJhdG9yPElFeHRlbnNpb24+KCkKLQkJewotCQkJcHVibGljIGludCBjb21wYXJlKElFeHRlbnNpb24gYXJnMCwgSUV4dGVuc2lvbiBhcmcxKQotCQkJewotCQkJCVN0cmluZyBzMSA9IGFyZzAuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCVN0cmluZyBzMiA9IGFyZzEuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCXJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLQkJCX0KLQkJfTsKLQkJQ29sbGVjdGlvbnMuc29ydChBcnJheXMuYXNMaXN0KHNvcnRlZEV4dGVuc2lvbiksIGNvbXBhcmVyKTsKLQkJcmV0dXJuIHNvcnRlZEV4dGVuc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudENoaWxkcmVuKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJcmVhZEVsZW1lbnRzKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJewotCQkJaWYgKCFyZWFkRWxlbWVudChlbGVtZW50c1tpXSkpCi0JCQkJbG9nVW5rbm93bkVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikKLQl7Ci0JCXJlYWRFbGVtZW50cyhleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeShJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGV4dGVuc2lvblBvaW50KQotCXsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlmb3IgKElFeHRlbnNpb24gZWxlbWVudCA6IGV4dGVuc2lvbnMpCi0JCQlyZWFkRXh0ZW5zaW9uKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotCXsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWdFbGVtZW50LmdldENoaWxkcmVuKFRBR19ERVNDUklQVElPTik7Ci0JCWlmIChjaGlsZHJlbi5sZW5ndGggPj0gMSkKLQkJewotCQkJcmV0dXJuIGNoaWxkcmVuWzBdLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NWYWx1ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGNsYXNzQXR0cmlidXRlTmFtZSkKLQl7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShjbGFzc0F0dHJpYnV0ZU5hbWUpOwotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpCi0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjYW5kaWRhdGVDaGlsZHJlbiA9IGNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oY2xhc3NBdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGNhbmRpZGF0ZUNoaWxkcmVuLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZUNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWFlZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvRGVidWdnZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuRGVidWdnZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklEZWJ1Z2dlcjsKLQotcHVibGljIGNsYXNzIERlYnVnZ2VyUmVnaXN0cnkKLXsKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIERlYnVnZ2VyRGVzY3JpcHRvcj4gZGVidWdnZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEZWJ1Z2dlckRlc2NyaXB0b3I+KCk7Ci0KLQlwdWJsaWMgRGVidWdnZXJSZWdpc3RyeSgpCi0JewotCQlEZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbmV3IERlYnVnZ2VyUmVnaXN0cnlSZWFkZXIoKTsKLQkJcmVnaXN0cnlSZWFkZXIuYWRkQ29uZmlncyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSURlYnVnZ2VyIGdldERlYnVnZ2VyKFN0cmluZyBpZCkKLQl7Ci0JCXJldHVybiAoSURlYnVnZ2VyKSBkZWJ1Z2dlcnMuZ2V0KGlkKTsKLQl9Ci0KLQlwdWJsaWMgSURlYnVnZ2VyW10gZ2V0RGVidWdnZXJzKCkKLQl7Ci0JCXJldHVybiAoSURlYnVnZ2VyW10pIGRlYnVnZ2Vycy52YWx1ZXMoKS50b0FycmF5KG5ldyBJRGVidWdnZXJbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlYnVnZ2VyKERlYnVnZ2VyRGVzY3JpcHRvciBkZXNjKQotCXsKLQkJZGVidWdnZXJzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0RlYnVnZ2VyUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0RlYnVnZ2VyUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkYTU3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9EZWJ1Z2dlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuRGVidWdnZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLQotcHVibGljIGNsYXNzIERlYnVnZ2VyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFQlVHR0VSID0gImRlYnVnZ2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1NOQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1NQQVRIID0gImNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QUk9DRVNTT1JfVFlQRV9JRCA9ICJwcm9jZXNzb3JUeXBlSWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERlYnVnZ2VyUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19ERUJVR0dFUikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0lEKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU05BTUUpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTTkFNRSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBjbGFzc3BhdGggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1NQQVRIKTsKLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9DTEFTU1BBVEgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmdbXSBlbnRyaWVzID0gY2xhc3NwYXRoLnNwbGl0KCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZW50cmllc1tpXTsKLQkJCWVudHJpZXNbaV0gPSBzdHJpbmcudHJpbSgpOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRSk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX05BTUUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgcHJvY2Vzc29yVHlwZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BST0NFU1NPUl9UWVBFX0lEKTsKLQkJaWYgKHByb2Nlc3NvclR5cGVJZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9QUk9DRVNTT1JfVFlQRV9JRCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJlZ2lzdHJ5LmFkZERlYnVnZ2VyKG5ldyBEZWJ1Z2dlckRlc2NyaXB0b3IoaWQsIGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGNsYXNzTmFtZSwgZW50cmllcywgbmFtZSwgcHJvY2Vzc29yVHlwZUlkKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVhZEVsZW1lbnQoRGVidWdnZXJSZWdpc3RyeSByZWdpc3RyeSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3MoRGVidWdnZXJSZWdpc3RyeSByZWdpc3RyeSkKLQl7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJcmVhZFJlZ2lzdHJ5KGV4dGVuc2lvblJlZ2lzdHJ5LCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAiZGVidWdnZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0ludm9rZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YmQ3ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW52b2tlcjsKLQotcHVibGljIGNsYXNzIEludm9rZXJSZWdpc3RyeQotewotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSVByb2Nlc3Nvckludm9rZXI+IGludm9rZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJUHJvY2Vzc29ySW52b2tlcj4oKTsKLQotCXB1YmxpYyBJbnZva2VyUmVnaXN0cnkoKQotCXsKLQkJSW52b2tlclJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbmV3IEludm9rZXJSZWdpc3RyeVJlYWRlcigpOwotCQlyZWdpc3RyeVJlYWRlci5hZGRDb25maWdzKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29ySW52b2tlciBnZXRQcm9jZXNzb3JJbnZva2VyKFN0cmluZyBpZCkKLQl7Ci0JCXJldHVybiAoSVByb2Nlc3Nvckludm9rZXIpIGludm9rZXJzLmdldChpZCk7Ci0JfQotCi0JcHVibGljIElQcm9jZXNzb3JJbnZva2VyW10gZ2V0UHJvY2Vzc29ySW52b2tlcnMoKQotCXsKLQkJcmV0dXJuIChJUHJvY2Vzc29ySW52b2tlcltdKSBpbnZva2Vycy52YWx1ZXMoKS50b0FycmF5KG5ldyBJUHJvY2Vzc29ySW52b2tlclswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW52b2tlckRlc2NyaXB0b3IoSVByb2Nlc3Nvckludm9rZXIgZGVzYykKLQl7Ci0JCWludm9rZXJzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L0ludm9rZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTI0NzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvSW52b2tlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTGF1bmNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlByb2Nlc3Nvckludm9rZXJEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgSW52b2tlclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JTlZPS0UgPSAiaW52b2tlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTU1BBVEggPSAiY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnZva2VyUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19JTlZPS0UpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBjbGFzc25hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQlpZiAoY2xhc3NuYW1lID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzcGF0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTU1BBVEgpOwotCQlpZiAoY2xhc3NwYXRoID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0NMQVNTUEFUSCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZ1tdIGVudHJpZXMgPSBjbGFzc3BhdGguc3BsaXQoIjsiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCVN0cmluZyBzdHJpbmcgPSBlbnRyaWVzW2ldOwotCQkJZW50cmllc1tpXSA9IHN0cmluZy50cmltKCk7Ci0JCX0KLQotCQlyZWdpc3RyeS5hZGRJbnZva2VyRGVzY3JpcHRvcihuZXcgUHJvY2Vzc29ySW52b2tlckRlc2NyaXB0b3IoaWQsIGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGNsYXNzbmFtZSwgZW50cmllcykpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlYWRFbGVtZW50KEludm9rZXJSZWdpc3RyeSByZWdpc3RyeSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JewotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3MoSW52b2tlclJlZ2lzdHJ5IHJlZ2lzdHJ5KQotCXsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkUmVnaXN0cnkoZXh0ZW5zaW9uUmVnaXN0cnksIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJpbnZva2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjAxN2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9Qcm9jZXNzb3JSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhNzJhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9Qcm9jZXNzb3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5Qcm9jZXNzb3JQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlByb2Nlc3Nvckluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuWFNMVFJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JSZWdpc3RyeQotewotCXByaXZhdGUgZmluYWwgTGlzdDxQcm9jZXNzb3JJbnN0YWxsPiBjb250cmlidXRlZEluc3RhbGxzID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzb3JJbnN0YWxsPigpOwotCXByaXZhdGUgTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gdXNlckluc3RhbGxzID0gbmV3IEFycmF5TGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4oKTsKLQlwcml2YXRlIElQcm9jZXNzb3JJbnN0YWxsIGRlZmF1bHRQcm9jZXNzb3I7Ci0JcHJpdmF0ZSBJUHJvY2Vzc29ySW5zdGFsbCBqcmVEZWZhdWx0UHJvY2Vzc29yOwotCXByaXZhdGUgSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxsczsKLQotCXB1YmxpYyBQcm9jZXNzb3JSZWdpc3RyeSgpCi0JewotCQlpbml0aWFsaXplRnJvbVN0b3JhZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZyb21TdG9yYWdlKCkKLQl7Ci0JCS8vIHJlYWQgZnJvbSB0aGUgcmVnaXN0cnkKLQkJUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIgcmVnaXN0cnlSZWFkZXIgPSBuZXcgUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIoKTsKLQkJcmVnaXN0cnlSZWFkZXIuYWRkQ29uZmlncyh0aGlzKTsKLQkJLy8gZmluZCB0aGUganJlIGRlZmF1bHQKLQkJZm9yIChJdGVyYXRvcjxQcm9jZXNzb3JJbnN0YWxsPiBpdGVyID0gY29udHJpYnV0ZWRJbnN0YWxscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCUlQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgPSAoSVByb2Nlc3Nvckluc3RhbGwpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGluc3RhbGwuZ2V0SWQoKS5lcXVhbHMoWFNMVFJ1bnRpbWUuSlJFX0RFRkFVTFRfUFJPQ0VTU09SX0lEKSkKLQkJCXsKLQkJCQlqcmVEZWZhdWx0UHJvY2Vzc29yID0gaW5zdGFsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvLyByZWFkIGZyb20gdGhlIHByZWZlcmVuY2VzCi0JCWFkZFBlcnNpc3RlZFZNcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQZXJzaXN0ZWRWTXMoKQotCXsKLQkJLy8gVHJ5IHJldHJpZXZpbmcgdGhlIFZNIHByZWZlcmVuY2VzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkJU3RyaW5nIHZtWE1MU3RyaW5nID0gTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhYU0xUUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwpOwotCi0JCS8vIElmIHRoZSBwcmVmZXJlbmNlIHdhcyBmb3VuZCwgbG9hZCBWTXMgZnJvbSBpdCBpbnRvIG1lbW9yeQotCQlpZiAodm1YTUxTdHJpbmcubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2bVhNTFN0cmluZy5nZXRCeXRlcygpKTsKLQkJCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IFByb2Nlc3NvclByZWZlcmVuY2VzLmZyb21YTUwoaW5wdXRTdHJlYW0pOwotCQkJCVN0cmluZyBkZWZhdWx0UHJvY2Vzc29ySWQgPSBwcmVmcy5nZXREZWZhdWx0UHJvY2Vzc29ySWQoKTsKLQkJCQl1c2VySW5zdGFsbHMgPSBwcmVmcy5nZXRQcm9jZXNzb3JzKCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxJUHJvY2Vzc29ySW5zdGFsbD4gaXRlciA9IHVzZXJJbnN0YWxscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGluc3RhbGwuZ2V0SWQoKS5lcXVhbHMoZGVmYXVsdFByb2Nlc3NvcklkKSkKLQkJCQkJewotCQkJCQkJZGVmYXVsdFByb2Nlc3NvciA9IGluc3RhbGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlZmF1bHRQcm9jZXNzb3IgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWZvciAoSXRlcmF0b3I8UHJvY2Vzc29ySW5zdGFsbD4gaXRlciA9IGNvbnRyaWJ1dGVkSW5zdGFsbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCQl7Ci0JCQkJCQlJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsID0gKElQcm9jZXNzb3JJbnN0YWxsKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChkZWZhdWx0UHJvY2Vzc29yID09IG51bGwgJiYgaW5zdGFsbC5nZXRJZCgpLmVxdWFscyhkZWZhdWx0UHJvY2Vzc29ySWQpKQotCQkJCQkJewotCQkJCQkJCWRlZmF1bHRQcm9jZXNzb3IgPSBpbnN0YWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCS8vIG1ha2UgdGhlIEpSRSB0aGUgZGVmYXVsdCBkZWZhdWx0Ci0JCWlmIChkZWZhdWx0UHJvY2Vzc29yID09IG51bGwpCi0JCXsKLQkJCWRlZmF1bHRQcm9jZXNzb3IgPSBqcmVEZWZhdWx0UHJvY2Vzc29yOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvY2Vzc29yKFN0cmluZyBidW5kbGVJZCwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBwcm9jZXNzb3JUeXBlSWQsIFN0cmluZyBjbGFzc3BhdGgsIFN0cmluZyBkZWJ1Z2dlcklkLCBTdHJpbmcgc3VwcG9ydHMpCi0JewotCQlJUHJvY2Vzc29ySmFyW10gamFycyA9IFByb2Nlc3Nvckluc3RhbGwuY3JlYXRlSmFycyhidW5kbGVJZCwgY2xhc3NwYXRoKTsKLQkJY29udHJpYnV0ZWRJbnN0YWxscy5hZGQobmV3IFByb2Nlc3Nvckluc3RhbGwoaWQsIGxhYmVsLCBwcm9jZXNzb3JUeXBlSWQsIGphcnMsIGRlYnVnZ2VySWQsIHN1cHBvcnRzLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvY2Vzc29yKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwpCi0JewotCQlpZiAoIWluc3RhbGwuaXNDb250cmlidXRlZCgpKQotCQkJdXNlckluc3RhbGxzLmFkZChpbnN0YWxsKTsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSBuZXdpbnN0YWxscyA9IG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtpbnN0YWxscy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShpbnN0YWxscywgMCwgbmV3aW5zdGFsbHMsIDAsIGluc3RhbGxzLmxlbmd0aCk7Ci0JCW5ld2luc3RhbGxzW2luc3RhbGxzLmxlbmd0aF0gPSBpbnN0YWxsOwotCQlpbnN0YWxscyA9IG5ld2luc3RhbGxzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2Nlc3NvcihpbnQgaW5kZXgpCi0JewotCQlJUHJvY2Vzc29ySW5zdGFsbCByZW1vdmVkID0gaW5zdGFsbHNbaW5kZXhdOwotCQlpZiAoIXJlbW92ZWQuaXNDb250cmlidXRlZCgpKQotCQkJdXNlckluc3RhbGxzLnJlbW92ZShyZW1vdmVkKTsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSBuZXdpbnN0YWxscyA9IG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtpbnN0YWxscy5sZW5ndGggLSAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShpbnN0YWxscywgMCwgbmV3aW5zdGFsbHMsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShpbnN0YWxscywgaW5kZXggKyAxLCBuZXdpbnN0YWxscywgaW5kZXgsIG5ld2luc3RhbGxzLmxlbmd0aCAtIGluZGV4KTsKLQkJaW5zdGFsbHMgPSBuZXdpbnN0YWxsczsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRQcm9jZXNzb3JzKCkKLQl7Ci0JCWlmIChpbnN0YWxscyA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YWxscyA9IG5ldyBJUHJvY2Vzc29ySW5zdGFsbFtjb250cmlidXRlZEluc3RhbGxzLnNpemUoKSArIHVzZXJJbnN0YWxscy5zaXplKCldOwotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cmlidXRlZEluc3RhbGxzLnNpemUoKTsgaSsrKQotCQkJewotCQkJCWluc3RhbGxzW2ldID0gKElQcm9jZXNzb3JJbnN0YWxsKSBjb250cmlidXRlZEluc3RhbGxzLmdldChpKTsKLQkJCQlzdGFydEluZGV4ID0gaSArIDE7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVzZXJJbnN0YWxscy5zaXplKCk7IGkrKykKLQkJCXsKLQkJCQlpbnN0YWxsc1tzdGFydEluZGV4ICsgaV0gPSAoSVByb2Nlc3Nvckluc3RhbGwpIHVzZXJJbnN0YWxscy5nZXQoaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbGxzOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29ySW5zdGFsbFtdIGdldFByb2Nlc3NvcnMoU3RyaW5nIGlkKQotCXsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscyA9IGdldFByb2Nlc3NvcnMoKTsKLQkJTGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJUHJvY2Vzc29ySW5zdGFsbD4oKTsKLQkJZm9yIChJUHJvY2Vzc29ySW5zdGFsbCB0eXBlIDogaW5zdGFsbHMpCi0JCXsKLQkJCWlmICh0eXBlLmdldFByb2Nlc3NvclR5cGUoKS5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmVzdWx0LmFkZCh0eXBlKTsKLQkJfQotCQlyZXR1cm4gKElQcm9jZXNzb3JJbnN0YWxsW10pIHJlc3VsdC50b0FycmF5KG5ldyBJUHJvY2Vzc29ySW5zdGFsbFswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFByb2Nlc3NvcihJUHJvY2Vzc29ySW5zdGFsbCBkZWZhdWx0SW5zdGFsbCkKLQl7Ci0JCWRlZmF1bHRQcm9jZXNzb3IgPSBkZWZhdWx0SW5zdGFsbDsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3Nvckluc3RhbGwgZ2V0RGVmYXVsdFByb2Nlc3NvcigpCi0JewotCQlyZXR1cm4gZGVmYXVsdFByb2Nlc3NvcjsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3Nvckluc3RhbGwgZ2V0SlJFRGVmYXVsdFByb2Nlc3NvcigpCi0JewotCQlyZXR1cm4ganJlRGVmYXVsdFByb2Nlc3NvcjsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRDb250cmlidXRlZFByb2Nlc3NvcnMoKQotCXsKLQkJcmV0dXJuIChJUHJvY2Vzc29ySW5zdGFsbFtdKSBjb250cmlidXRlZEluc3RhbGxzLnRvQXJyYXkobmV3IElQcm9jZXNzb3JJbnN0YWxsWzBdKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9Qcm9jZXNzb3JSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NzU3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9Qcm9jZXNzb3JSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NvclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWdpc3RyeVJlYWRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19wcm9jZXNzb3IgPSAicHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RZUEVfSUQgPSAicHJvY2Vzc29yVHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERUJVR0dFUl9JRCA9ICJkZWJ1Z2dlcklkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTU1BBVEggPSAiY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TVVBQT1JUUyA9ICJzdXBwb3J0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUHJvY2Vzc29yUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19wcm9jZXNzb3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBsYWJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MQUJFTCk7Ci0JCWlmIChsYWJlbCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9MQUJFTCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBwcm9jZXNzb3JUeXBlSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRV9JRCk7Ci0JCWlmIChwcm9jZXNzb3JUeXBlSWQgPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfVFlQRV9JRCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBjbGFzc3BhdGggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1NQQVRIKTsKLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9DTEFTU1BBVEgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgZGVidWdnZXJJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUJVR0dFUl9JRCk7Ci0KLQkJU3RyaW5nIHN1cHBvcnRzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NVUFBPUlRTKTsKLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9TVVBQT1JUUyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJlZ2lzdHJ5LmFkZFByb2Nlc3NvcihlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpLCBpZCwgbGFiZWwsIHByb2Nlc3NvclR5cGVJZCwgY2xhc3NwYXRoLCBkZWJ1Z2dlcklkLCBzdXBwb3J0cyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVhZEVsZW1lbnQoUHJvY2Vzc29yUmVnaXN0cnkgcmVnaXN0cnksIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb25maWdzKFByb2Nlc3NvclJlZ2lzdHJ5IHJlZ2lzdHJ5KQotCXsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQlyZWFkUmVnaXN0cnkoZXh0ZW5zaW9uUmVnaXN0cnksIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsICJwcm9jZXNzb3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L1Byb2Nlc3NvclR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODBhZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkZlYXR1cmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5Qcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5Ci17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ19TVUZGSVggPSAiLkRFU0MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVUZGSVggPSAiLlRZUEUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotCXByaXZhdGUgSVByb2Nlc3NvclR5cGVbXSBpbnN0YWxsVHlwZXM7Ci0KLQlwdWJsaWMgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5KCkKLQl7Ci0JCVByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlciByZWdpc3RyeVJlYWRlciA9IG5ldyBQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIoKTsKLQkJcmVnaXN0cnlSZWFkZXIuYWRkQ29uZmlncyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3NvclR5cGVbXSBnZXRQcm9jZXNzb3JUeXBlcygpCi0JewotCQlpZiAoaW5zdGFsbFR5cGVzID09IG51bGwpCi0JCXsKLQkJCUxpc3Q8UHJvY2Vzc29yVHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NvclR5cGU+KCk7Ci0JCQlTdHJpbmcgZmVhdHVyZVhNTFN0cmluZyA9IExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWFNMVFJ1bnRpbWUuUFJFRl9GRUFUVVJFX1hNTCk7Ci0JCQkvLyBJZiB0aGUgcHJlZmVyZW5jZSB3YXMgZm91bmQsIGxvYWQgVk1zIGZyb20gaXQgaW50byBtZW1vcnkKLQkJCUZlYXR1cmVQcmVmZXJlbmNlcyBwcmVmcyA9IG51bGw7Ci0JCQlpZiAoZmVhdHVyZVhNTFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmZWF0dXJlWE1MU3RyaW5nLmdldEJ5dGVzKCkpOwotCQkJCQlwcmVmcyA9IEZlYXR1cmVQcmVmZXJlbmNlcy5mcm9tWE1MKGlucHV0U3RyZWFtKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgcHJvcFhNTFN0cmluZyA9IExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWFNMVFJ1bnRpbWUuUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwpOwotCQkJLy8gSWYgdGhlIHByZWZlcmVuY2Ugd2FzIGZvdW5kLCBsb2FkIFZNcyBmcm9tIGl0IGludG8gbWVtb3J5Ci0JCQlPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzIG91dHB1dHByZWZzID0gbnVsbDsKLQkJCWlmIChwcm9wWE1MU3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHByb3BYTUxTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCW91dHB1dHByZWZzID0gT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcy5mcm9tWE1MKGlucHV0U3RyZWFtKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5BVFRfSUQpOwotCQkJCVN0cmluZyBsYWJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5BVFRfTEFCRUwpOwotCQkJCVN0cmluZyB0cmFuc0ZhY3RvcnlOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9UUkFOU0ZPUk1FUl9GQUNUT1JZX05BTUUpOwotCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gZmVhdHVyZVZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJCVByb3BlcnRpZXMgcHJvcGVydHlWYWx1ZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCWlmIChwcmVmcyAhPSBudWxsICYmIHByZWZzLmdldEZlYXR1cmVzVmFsdWVzKGlkKSAhPSBudWxsKQotCQkJCQlmZWF0dXJlVmFsdWVzLnB1dEFsbChwcmVmcy5nZXRGZWF0dXJlc1ZhbHVlcyhpZCkpOwotCQkJCWlmIChvdXRwdXRwcmVmcyAhPSBudWxsICYmIG91dHB1dHByZWZzLmdldE91dHB1dFByb3BlcnR5VmFsdWVzKGlkKSAhPSBudWxsKQotCQkJCQlwcm9wZXJ0eVZhbHVlcy5wdXRBbGwob3V0cHV0cHJlZnMuZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoaWQpKTsKLQotCQkJCVN0cmluZyBvdXRwdXRQcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLkFUVF9PVVRQVVRfUFJPUEVSVElFUyk7Ci0JCQkJVVJMIG91dHB1dFByb3BlcnRpZXNVUkwgPSBGaWxlTG9jYXRvci5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKSwgbmV3IFBhdGgob3V0cHV0UHJvcGVydGllcyksIG51bGwpOwotCQkJCVN0cmluZyBmZWF0dXJlUHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFByb2Nlc3NvclR5cGVSZWdpc3RyeVJlYWRlci5BVFRfRkVBVFVSRV9QUk9QRVJUSUVTKTsKLQkJCQlVUkwgZmVhdHVyZVByb3BlcnRpZXNVUkwgPSBGaWxlTG9jYXRvci5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKSwgbmV3IFBhdGgoZmVhdHVyZVByb3BlcnRpZXMpLCBudWxsKTsKLQkJCQkKLQkJCQl0eXBlcy5hZGQobmV3IFByb2Nlc3NvclR5cGUoaWQsIGxhYmVsLCBmZWF0dXJlUHJvcGVydGllc1VSTCwgb3V0cHV0UHJvcGVydGllc1VSTCwgZmVhdHVyZVZhbHVlcywgcHJvcGVydHlWYWx1ZXMsIHRyYW5zRmFjdG9yeU5hbWUpKTsKLQkJCX0KLQkJCWluc3RhbGxUeXBlcyA9IChJUHJvY2Vzc29yVHlwZVtdKSB0eXBlcy50b0FycmF5KG5ldyBJUHJvY2Vzc29yVHlwZVswXSk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbGxUeXBlczsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3NvclR5cGVbXSBnZXRQcm9jZXNzb3JUeXBlc0V4Y2xKUkVEZWZhdWx0KCkKLQl7Ci0JCUlQcm9jZXNzb3JUeXBlW10gaW5zdGFsbFR5cGVzID0gZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQkJTGlzdDxJUHJvY2Vzc29yVHlwZT4gZXhjbFR5cGVzID0gbmV3IEFycmF5TGlzdDxJUHJvY2Vzc29yVHlwZT4oaW5zdGFsbFR5cGVzLmxlbmd0aCAtIDEpOwotCQlmb3IgKElQcm9jZXNzb3JUeXBlIHR5cGUgOiBpbnN0YWxsVHlwZXMpCi0JCXsKLQkJCWlmICghdHlwZS5pc0pSRURlZmF1bHQoKSkKLQkJCQlleGNsVHlwZXMuYWRkKHR5cGUpOwotCQl9Ci0JCXJldHVybiAoSVByb2Nlc3NvclR5cGVbXSkgZXhjbFR5cGVzLnRvQXJyYXkobmV3IElQcm9jZXNzb3JUeXBlWzBdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRUeXBlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29yVHlwZSBnZXRQcm9jZXNzb3JUeXBlKFN0cmluZyBpZCkKLQl7Ci0JCUlQcm9jZXNzb3JUeXBlW10gaW5zdGFsbFR5cGVzID0gZ2V0UHJvY2Vzc29yVHlwZXMoKTsKLQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogaW5zdGFsbFR5cGVzKQotCQl7Ci0JCQlpZiAodHlwZS5nZXRJZCgpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVnaXN0cnkvUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3ZjFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9Qcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzb3JUeXBlUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX3Byb2Nlc3NvclR5cGUgPSAicHJvY2Vzc29yVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UUkFOU0ZPUk1FUl9GQUNUT1JZX05BTUUgPSAidHJhbnNmb3JtZXJGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9PVVRQVVRfUFJPUEVSVElFUyA9ICJvdXRwdXRQcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9GRUFUVVJFX1BST1BFUlRJRVMgPSAiZmVhdHVyZVByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByb2Nlc3NvclR5cGVSZWdpc3RyeSByZWdpc3RyeTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotCXsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX3Byb2Nlc3NvclR5cGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9JRCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBsYWJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MQUJFTCk7Ci0JCWlmIChsYWJlbCA9PSBudWxsKQotCQl7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGVsZW1lbnQsIEFUVF9MQUJFTCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBvdXRwdXRQcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX09VVFBVVF9QUk9QRVJUSUVTKTsKLQkJaWYgKG91dHB1dFByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShlbGVtZW50LCBBVFRfT1VUUFVUX1BST1BFUlRJRVMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgZmVhdHVyZVByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRkVBVFVSRV9QUk9QRVJUSUVTKTsKLQkJaWYgKGZlYXR1cmVQcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCWxvZ01pc3NpbmdBdHRyaWJ1dGUoZWxlbWVudCwgQVRUX0ZFQVRVUkVfUFJPUEVSVElFUyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJlZ2lzdHJ5LmFkZFR5cGUoZWxlbWVudCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVhZEVsZW1lbnQoUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJcmVhZEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29uZmlncyhQcm9jZXNzb3JUeXBlUmVnaXN0cnkgcmVnaXN0cnkpCi0JewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgInByb2Nlc3NvclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2ludGVybmFsL2xhdW5jaGluZy9yZWdpc3RyeS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTY0MDU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvaW50ZXJuYWwvbGF1bmNoaW5nL3JlZ2lzdHJ5L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUFic3RyYWN0UmVnaXN0cnlSZWFkZXIuMz0sIGV4dGVuc2lvbiAKLUFic3RyYWN0UmVnaXN0cnlSZWFkZXIuNT1SZXF1aXJlZCBhdHRyaWJ1dGUgJwotQWJzdHJhY3RSZWdpc3RyeVJlYWRlci42PScgbm90IGRlZmluZWQKLUFic3RyYWN0UmVnaXN0cnlSZWFkZXIuNz1SZXF1aXJlZCBzdWIgZWxlbWVudCAnCi1BYnN0cmFjdFJlZ2lzdHJ5UmVhZGVyLjg9JyBub3QgZGVmaW5lZAotQWJzdHJhY3RSZWdpc3RyeVJlYWRlci45PVVua25vd24gZXh0ZW5zaW9uIHRhZyBmb3VuZDogCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JRGVidWdnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lEZWJ1Z2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQ3YmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lEZWJ1Z2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7Ci0KLS8qKgotICogQW4gWFNMVCBkZWJ1Z2dlci4gVHlwaWNhbGx5IHRoaXMgd2lsbCBoYXZlIGJlZW4gCi0gKiBjb250cmlidXRlZCB2aWEgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmRlYnVnZ2VyPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVidWdnZXIKLXsKLQkvKioKLQkgKiBHZXQgdGhlIHVuaXF1ZSBpZCBmb3IgdGhpcyBkZWJ1Z2dlci4KLQkgKiBAcmV0dXJuIGRlYnVnZ2VyIGlkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNldCBvZiBidW5kbGUtcmVsYXRpdmUgamFyIGZpbGVzIHRvIGFkZCB0byB0aGUgY2xhc3NwYXRoLiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIGJ1bmRsZS1yZWxhdGl2ZSBqYXJzCi0JICovCi0JU3RyaW5nW10gZ2V0Q2xhc3NQYXRoKCk7Ci0KLQkvKioKLQkgKiBHZXQgYSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBkZWJ1Z2dlcgotCSAqIEByZXR1cm4gdGhlIG5hbWUgZm9yIHRoZSBkZWJ1Z2dlcgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2Nlc3NvciB0eXBlIHRoYXQgdGhpcyBkZWJ1Z2dlciBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiBAcmV0dXJuIHRoZSBwcm9jZXNzb3IgdHlwZQotCSAqLwotCUlQcm9jZXNzb3JUeXBlIGdldFByb2Nlc3NvclR5cGUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBkZWJ1Z2dlcgotCSAqIEByZXR1cm4gdGhlIGNsYXNzIG5hbWUKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JRmVhdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmZjQwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBBIGZlYXR1cmUgc3VwcG9ydGVkIGJ5IGFuIFhTTFQgcHJvY2Vzc29yLiAKLSAqIAotICogQGF1dGhvciBEb3VnIFNhdGNod2VsbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlCi17Ci0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+c3RyaW5nPC9jb2RlPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqLwotCVN0cmluZyBUWVBFX1NUUklORyA9ICJzdHJpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKi8KLQlTdHJpbmcgVFlQRV9CT09MRUFOID0gImJvb2xlYW4iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+aW50PC9jb2RlPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqLwotCVN0cmluZyBUWVBFX0lOVCA9ICJpbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+ZG91YmxlPC9jb2RlPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqLwotCVN0cmluZyBUWVBFX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+Y2xhc3M8L2NvZGU+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICovCi0JU3RyaW5nIFRZUEVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29uc3RhbnQgZm9yIGZlYXR1cmVzIG9mIHR5cGUgPGNvZGU+b2JqZWN0PC9jb2RlPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqLwotCVN0cmluZyBUWVBFX09CSkVDVCA9ICJvYmplY3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZXQgdGhlIFVSSSBmb3IgdGhpcyBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBVUkkKLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLQkvKioKLQkgKiBHZXQgYSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBkZXNjcmlwdGlvbgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogR2V0IHRoZSB0eXBlIG9mIHRoaXMgZmVhdHVyZS4gV2lsbCBtYXRjaCBvbmUgb2YgdGhlIFRZUEUgY29uc3RhbnRzIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIEByZXR1cm4gdGhlIGZlYXR1cmUgdHlwZTogb25lIG9mIDxjb2RlPlRZUEVfU1RSSU5HPC9jb2RlPiwgPGNvZGU+VFlQRV9CT09MRUFOPC9jb2RlPiwgCi0JICogPGNvZGU+VFlQRV9JTlQ8L2NvZGU+LCA8Y29kZT5UWVBFX0RPVUJMRTwvY29kZT4sIDxjb2RlPlRZUEVfRkxPQVQ8L2NvZGU+LCA8Y29kZT5UWVBFX0NMQVNTPC9jb2RlPiwgCi0JICogb3IgPGNvZGU+VFlQRV9PQkpFQ1Q8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbGlkIG9uZSBmb3IgdGhpcyBmZWF0dXJlLgotCSAqIEByZXR1cm4gYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gd2l0aCBzZXZlcml0eSA8Y29kZT5PSzwvY29kZT4gaWYgdmFsaWQsIG9yIDxjb2RlPkVSUk9SPC9jb2RlPiBpZiBpbnZhbGlkLgotCSAqLwotCUlTdGF0dXMgdmFsaWRhdGVWYWx1ZShTdHJpbmcgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSU91dHB1dFByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JT3V0cHV0UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzZWJlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JT3V0cHV0UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi0vKioKLSAqIEFuIG91dHB1dCBwcm9wZXJ0eSBzdXBwb3J0ZWQgYnkgYW4gWFNMVCBwcm9jZXNzb3IuIAotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU91dHB1dFByb3BlcnR5Ci17Ci0JLyoqCi0JICogR2V0IHRoZSBVUkkgb2YgdGhpcyBvdXRwdXQgcHJvcGVydHkuIAotCSAqIEByZXR1cm4gYSB1bmlxdWUgVVJJCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotCi0JLyoqCi0JICogR2V0IGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgb3V0cHV0IHByb3BlcnR5LiAKLQkgKiBAcmV0dXJuIGEgZGVzY3JpcHRpb24KLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JJbnN0YWxsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9JUHJvY2Vzc29ySW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmU3MGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZzsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiBhbiBYU0xUIHByb2Nlc3NvciAoZS5nLiBYYWxhbiAyLjcuMCkuCi0gKiAKLSAqIEBzZWUgSVByb2Nlc3Nvckluc3RhbGwKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc29ySW5zdGFsbAotewotCS8qKgotCSAqIEdldCB0aGUgdW5xaXVlIGlkIG9mIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lIG9mIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBpbnN0YWxsCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdGhlIHByb2Nlc3NvciB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbGwKLQkgKiBAcmV0dXJuIHRoZSBwcm9jZXNzb3IgdHlwZSBpZAotCSAqLwotCUlQcm9jZXNzb3JUeXBlIGdldFByb2Nlc3NvclR5cGUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgamFyIGZpbGVzIGZvciB0aGlzIHByb2Nlc3NvcgotCSAqIEByZXR1cm4gYSBzZXQgb2YgamFyIGZpbGVzCi0JICovCi0JSVByb2Nlc3NvckphcltdIGdldFByb2Nlc3NvckphcnMoKTsKLQotCS8qKgotCSAqIEdldCB3aGV0aGVyIHRoaXMgaW5zdGFsbCBoYXMgYmVlbiBjb250cmlidXRlZCB2aWEgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29udHJpYnV0ZWQgdmlhIHRoZSBleHRlbnNpb24gcG9pbnQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBpc0NvbnRyaWJ1dGVkKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIFhTTFQgdmVyc2lvbnMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaW5zdGFsbCBoYXMgYSBkZWJ1Z2dlciwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQkvLyBUT0RPIGRlcHJlY2F0ZSBhbmQgdXNlIGJvb2xlYW4gc3VwcG9ydHMgaW5zdGFlZAotCVN0cmluZyBnZXRTdXBwb3J0cygpOwotCi0JLyoqCi0JICogR2V0IHdoZXRoZXIgdGhpcyBpbnN0YWxsIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgeHNsdCB2ZXJzaW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpbnN0YWxsIHN1cHBvcnRzIHRoZSB2ZXJzaW9uLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHhzbHRWZXJzaW9uKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZGVidWdnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFsbAotCSAqIEByZXR1cm4gdGhlIGRlYnVnZ2VyLCBvciBudWxsIGlmIG5vIGRlYnVnZ2VyIGhhcyBiZWVuIHNldAotCSAqLwotCUlEZWJ1Z2dlciBnZXREZWJ1Z2dlcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3Nvckludm9rZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2U0NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3Nvckludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzb3JJbnZva2VyCi17Ci0JU3RyaW5nIGdldElkKCk7Ci0KLQlTdHJpbmcgZ2V0SW52b2tlckNsYXNzTmFtZSgpOwotCi0JU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3Nvckphci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3Nvckphci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDJkYzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JKYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEEgamFyIGZpbGUgZm9yIGFuIFhTTFQgcHJvY2Vzc29yCi0gKiAKLSAqIEBzZWUgSVByb2Nlc3Nvckluc3RhbGwKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc29ySmFyCi17Ci0JLyoqCi0JICogVGhlIHBhdGggbWF5IGJlIHJlbGF0aXZlIG9yIGFic29sdXRlOyBpbiB0aGUgd29ya3NwYWNlIG9yIGV4dGVybmFsLgotCSAqIEByZXR1cm4gdGhlIHBhdGggdG8gdGhpcyBqYXIKLQkgKi8KLQlJUGF0aCBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBUaGUgVVJMIHdpbGwgYWx3YXlzIGJlIGFic29sdXRlIGFuZCBjYW4gYmUgb3BlbmVkLgotCSAqIEByZXR1cm4gYSBVUkwgdG8gdGhlIGphcgotCSAqLwotCVVSTCBhc1VSTCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3NvclR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL0lQcm9jZXNzb3JUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MThhMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvSVByb2Nlc3NvclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBBIHBhcnRpY3VsYXIgdHlwZSBvZiBYU0xUIFByb2Nlc3NvciAoZS5nLiBYYWxhbikgZm9yIHdoaWNoIHRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGluc3RhbGxzLgotICogCi0gKiBAc2VlIElQcm9jZXNzb3JJbnN0YWxsCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2Nlc3NvclR5cGUKLXsKLQlTdHJpbmcgZ2V0SWQoKTsKLQotCVN0cmluZyBnZXRMYWJlbCgpOwotCi0JYm9vbGVhbiBpc0pSRURlZmF1bHQoKTsKLQotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckZhY3RvcnlOYW1lKCk7Ci0KLQlJRmVhdHVyZVtdIGdldEZlYXR1cmVzKCk7Ci0KLQlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEZlYXR1cmVWYWx1ZXMoKTsKLQotCUlPdXRwdXRQcm9wZXJ0eVtdIGdldE91dHB1dFByb3BlcnRpZXMoKTsKLQotCVByb3BlcnRpZXMgZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njg3NDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9Qcm9jZXNzb3JJbnN0YWxsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9Qcm9jZXNzb3JJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NWM1ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvUHJvY2Vzc29ySW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUGx1Z2luUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc29ySW5zdGFsbCBpbXBsZW1lbnRzIElQcm9jZXNzb3JJbnN0YWxsCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCXByaXZhdGUgSVByb2Nlc3NvckphcltdIGphcnM7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbnRyaWJ1dGVkOwotCXByaXZhdGUgU3RyaW5nIGRlYnVnZ2VySWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc3VwcG9ydHM7Ci0KLQlwdWJsaWMgUHJvY2Vzc29ySW5zdGFsbChTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHR5cGVJZCwgSVByb2Nlc3NvckphcltdIGphcnMsIFN0cmluZyBkZWJ1Z2dlcklkLCBTdHJpbmcgc3VwcG9ydHMsIGJvb2xlYW4gY29udHJpYnV0ZWQpCi0JewotCQl0aGlzLmlkID0gaWQ7Ci0JCW5hbWUgPSBsYWJlbDsKLQkJdHlwZSA9IHR5cGVJZDsKLQkJdGhpcy5kZWJ1Z2dlcklkID0gZGVidWdnZXJJZDsKLQkJdGhpcy5jb250cmlidXRlZCA9IGNvbnRyaWJ1dGVkOwotCQl0aGlzLmphcnMgPSBqYXJzOwotCQl0aGlzLnN1cHBvcnRzID0gc3VwcG9ydHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBJUHJvY2Vzc29ySmFyW10gZ2V0UHJvY2Vzc29ySmFycygpCi0JewotCQlyZXR1cm4gamFyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzb3JKYXJzKElQcm9jZXNzb3JKYXJbXSBqYXJzKQotCXsKLQkJdGhpcy5qYXJzID0gamFyczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NvclR5cGVJZCgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3NvclR5cGUgZ2V0UHJvY2Vzc29yVHlwZSgpCi0JewotCQlyZXR1cm4gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yVHlwZSh0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzb3JUeXBlSWQoU3RyaW5nIGlkKQotCXsKLQkJdHlwZSA9IGlkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29udHJpYnV0ZWQoKQotCXsKLQkJcmV0dXJuIGNvbnRyaWJ1dGVkOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvckphcltdIGNyZWF0ZUphcnMoU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgY2xhc3NwYXRoKQotCXsKLQkJSVByb2Nlc3NvckphcltdIGphcnM7Ci0JCWlmIChjbGFzc3BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSVByb2Nlc3NvckphclswXTsKLQkJU3RyaW5nW10gamFyc3RyaW5nID0gY2xhc3NwYXRoLnNwbGl0KCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJamFycyA9IG5ldyBJUHJvY2Vzc29ySmFyW2phcnN0cmluZy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphcnN0cmluZy5sZW5ndGg7IGkrKykKLQkJewotCQkJU3RyaW5nIGphciA9IGphcnN0cmluZ1tpXTsKLQkJCXRyeQotCQkJewotCQkJCWlmIChqYXIuc3RhcnRzV2l0aCgiJHtlY2xpcHNlX29yYml0OiIpICYmIGphci5lbmRzV2l0aCgifSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl7Ci0JCQkJCWphciA9IGphci5zdWJzdHJpbmcoIiR7ZWNsaXBzZV9vcmJpdDoiLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlqYXIgPSBqYXIuc3Vic3RyaW5nKDAsamFyLmxlbmd0aCgpLTEpOwotCQkJCQkvL2phciA9IFV0aWxzLmdldEZpbGVMb2NhdGlvbihqYXIsIiIpOwotCQkJCQlqYXJzW2ldID0gbmV3IFBsdWdpblByb2Nlc3NvckphcihqYXIsIG51bGwpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlqYXIgPSBVdGlscy5nZXRGaWxlTG9jYXRpb24oYnVuZGxlSWQsamFyKTsKLQkJCQkJamFyc1tpXSA9IG5ldyBQbHVnaW5Qcm9jZXNzb3JKYXIoYnVuZGxlSWQsIG5ldyBQYXRoKGphcikpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gamFyczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNEZWJ1Z2dlcigpCi0JewotCQlyZXR1cm4gZGVidWdnZXJJZCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyB4c2x0VmVyc2lvbikKLQl7Ci0JCXJldHVybiBzdXBwb3J0cy5pbmRleE9mKHhzbHRWZXJzaW9uKSA+PSAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwcG9ydHMoKQotCXsKLQkJcmV0dXJuIHN1cHBvcnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1cHBvcnRzKFN0cmluZyBzdXBwb3J0cykKLQl7Ci0JCXRoaXMuc3VwcG9ydHMgPSBzdXBwb3J0czsKLQl9Ci0KLQlwdWJsaWMgSURlYnVnZ2VyIGdldERlYnVnZ2VyKCkKLQl7Ci0JCXJldHVybiBYU0xUUnVudGltZS5nZXREZWJ1Z2dlcihkZWJ1Z2dlcklkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z2dlcklkKFN0cmluZyBkZWJ1Z2dlcklkKQotCXsKLQkJdGhpcy5kZWJ1Z2dlcklkID0gZGVidWdnZXJJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YmUzOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WT0tFUl9ERVNDUklQVE9SID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuSU5WT0tFUl9ERVNDUklQVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPQ0VTU09SID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9QUk9DRVNTT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQVVOQ0hfVFlQRSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfTEFVTkNIX1RZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFX1VSSV9UWVBFID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9CQVNFX1VSSV9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQkFTRV9VUklfRElSRUNUT1JZID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9CQVNFX1VSSV9ESVJFQ1RPUlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9KRUNUX05BTUUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1BST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lOUFVUX0ZJTEUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX0lOUFVUX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9PVVRQVVRfRklMRSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfT1VUUFVUX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9PVVRQVVRfTUVUSE9EID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9PVVRQVVRfTUVUSE9EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1VUUFVUX1BST1BFUlRJRVMgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX09VVFBVVF9QUk9QRVJUSUVTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RZTEVTSEVFVFNfTElTVCA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfU1RZTEVTSEVFVFNfTElTVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFTkRFUl9UTyA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfUkVOREVSX1RPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0xBVU5DSF9DT05GSUdfVFlQRSA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUEVSRk9STV9SRU5ERVIgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1BFUkZPUk1fUkVOREVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEUgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1VTRV9ERUZBVUxUX09VVFBVVF9GSUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1BFTl9GSUxFID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9PUEVOX0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9DRVNTT1JfV09SS0lOR19ESVIgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX1BST0NFU1NPUl9XT1JLSU5HX0RJUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRV9ERUZBVUxUX1BST0NFU1NPUl9XT1JLSU5HX0RJUiA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SX1dPUktJTkdfRElSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VfRkVBVFVSRVNfRlJPTV9QUkVGRVJFTkNFUyA9IExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQgKyAiLkFUVFJfVVNFX0ZFQVRVUkVTX0ZST01fUFJFRkVSRU5DRVMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VfUFJPUEVSVElFU19GUk9NX1BSRUZFUkVOQ0VTID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9VU0VfUFJPUEVSVElFU19GUk9NX1BSRUZFUkVOQ0VTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSlJFX0RFRkFVTFRfVFlQRV9UWVBFID0gIi5BVFRSX0pSRV9ERUZBVUxUX1RZUEVfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZFQVRVUkVTID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9GRUFUVVJFUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BJUEVMSU5FID0gTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCArICIuQVRUUl9QSVBFTElORSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFRkFVTFRfREVCVUdHSU5HX0lOU1RBTExfSUQgPSBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lEICsgIi5BVFRSX0RFRkFVTFRfREVCVUdHSU5HX0lOU1RBTExfSUQiOzsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEFMQU5fVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLnByb2Nlc3NvclR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FYT05fVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLnByb2Nlc3NvclR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FYT05fMV8wX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbl8xXzAucHJvY2Vzc29yVHlwZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1hTTFRSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9YU0xUUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTg4ZWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL1hTTFRSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5GZWF0dXJlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTGF1bmNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLk91dHB1dFByb3BlcnR5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuUHJvY2Vzc29ySmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlByb2Nlc3NvclByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5LkRlYnVnZ2VyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcucmVnaXN0cnkuSW52b2tlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5LlByb2Nlc3NvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLnJlZ2lzdHJ5LlByb2Nlc3NvclR5cGVSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIFhTTFRSdW50aW1lCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9QUk9DRVNTT1JfWE1MID0gIlBSRUZfUFJPQ0VTU09SX1hNTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0ZFQVRVUkVfWE1MID0gIlBSRUZfRkVBVFVSRV9YTUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwgPSAiUFJFRl9PVVRQVVRfUFJPUEVSVElFU19YTUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlJFX0RFRkFVTFRfUFJPQ0VTU09SX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmpyZS5kZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpSRV9ERUZBVUxUX1BST0NFU1NPUl9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUuanJlRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBORVhUX0lEX0xPQ0sgPSBuZXcgYnl0ZVswXTsKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gUkVHSVNUUllfTE9DSyA9IG5ldyBieXRlWzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxhc3RTdGFuZGluSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc29yVHlwZVJlZ2lzdHJ5IHByb2Nlc3NvclR5cGVSZWdpc3RyeTsKLQlwcml2YXRlIHN0YXRpYyBQcm9jZXNzb3JSZWdpc3RyeSBwcm9jZXNzb3JSZWdpc3RyeTsKLQlwcml2YXRlIHN0YXRpYyBJbnZva2VyUmVnaXN0cnkgaW52b2tlclJlZ2lzdHJ5OwotCXByaXZhdGUgc3RhdGljIERlYnVnZ2VyUmVnaXN0cnkgZGVidWdnZXJSZWdpc3RyeTsKLQotCXByaXZhdGUgc3RhdGljIFByb2Nlc3NvclR5cGVSZWdpc3RyeSBnZXRQcm9jZXNzb3JUeXBlUmVnaXN0cnkoKQotCXsKLQkJc3luY2hyb25pemVkIChSRUdJU1RSWV9MT0NLKQotCQl7Ci0JCQlpZiAocHJvY2Vzc29yVHlwZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQkJcHJvY2Vzc29yVHlwZVJlZ2lzdHJ5ID0gbmV3IFByb2Nlc3NvclR5cGVSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzb3JUeXBlUmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzb3JSZWdpc3RyeSBnZXRQcm9jZXNzb3JSZWdpc3RyeSgpCi0JewotCQlzeW5jaHJvbml6ZWQgKFJFR0lTVFJZX0xPQ0spCi0JCXsKLQkJCWlmIChwcm9jZXNzb3JSZWdpc3RyeSA9PSBudWxsKQotCQkJCXByb2Nlc3NvclJlZ2lzdHJ5ID0gbmV3IFByb2Nlc3NvclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NvclJlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgc3RhdGljIEludm9rZXJSZWdpc3RyeSBnZXRJbnZva2VyUmVnaXN0cnkoKQotCXsKLQkJc3luY2hyb25pemVkIChSRUdJU1RSWV9MT0NLKQotCQl7Ci0JCQlpZiAoaW52b2tlclJlZ2lzdHJ5ID09IG51bGwpCi0JCQkJaW52b2tlclJlZ2lzdHJ5ID0gbmV3IEludm9rZXJSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnZva2VyUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVidWdnZXJSZWdpc3RyeSBnZXREZWJ1Z2dlclJlZ2lzdHJ5KCkKLQl7Ci0JCXN5bmNocm9uaXplZCAoUkVHSVNUUllfTE9DSykKLQkJewotCQkJaWYgKGRlYnVnZ2VyUmVnaXN0cnkgPT0gbnVsbCkKLQkJCQlkZWJ1Z2dlclJlZ2lzdHJ5ID0gbmV3IERlYnVnZ2VyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZGVidWdnZXJSZWdpc3RyeTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKQotCXsKLQkJTGF1bmNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJc3luY2hyb25pemVkIChSRUdJU1RSWV9MT0NLKQotCQl7Ci0JCQkvLyBmb3JjZSB0aGUgcmVnaXN0cmllcyB0byBiZSByZS1pbml0aWFsaXNlZCBuZXh0IHRpbWUgaXQgaXMgcmVxdWlyZWQKLQkJCXByb2Nlc3NvclJlZ2lzdHJ5ID0gbnVsbDsKLQkJCXByb2Nlc3NvclR5cGVSZWdpc3RyeSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGEgdW5pcXVlIHByb2Nlc3NvciBpbnN0YWxsIGlkLiBDaGVjayBleGlzdGluZyAncmVhbCcgcHJvY2Vzc29ycywgYXMKLQkgKiB3ZWxsIGFzIHRoZSBsYXN0IGlkIHVzZWQgZm9yIGEgc3RhbmRpbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVbmlxdWVQcm9jZXNzb3JJZChJUHJvY2Vzc29yVHlwZSB0eXBlKQotCXsKLQkJSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscyA9IFhTTFRSdW50aW1lLmdldFByb2Nlc3NvcnModHlwZS5nZXRJZCgpKTsKLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChORVhUX0lEX0xPQ0spCi0JCXsKLQkJCWRvCi0JCQl7Ci0JCQkJaWQgPSBTdHJpbmcudmFsdWVPZigrK2xhc3RTdGFuZGluSUQpOwotCQkJfQotCQkJd2hpbGUgKGlzVGFrZW4oaWQsIGluc3RhbGxzKSk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3NvckphciBjcmVhdGVQcm9jZXNzb3JKYXIoSVBhdGggcGF0aCkKLQl7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc29ySmFyKHBhdGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWtlbihTdHJpbmcgaWQsIElQcm9jZXNzb3JJbnN0YWxsW10gaW5zdGFsbHMpCi0JewotCQlmb3IgKElQcm9jZXNzb3JJbnN0YWxsIGluc3RhbGwgOiBpbnN0YWxscykKLQkJewotCQkJaWYgKGluc3RhbGwuZ2V0SWQoKS5lcXVhbHMoaWQpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElEZWJ1Z2dlcltdIGdldERlYnVnZ2VycygpCi0JewotCQlyZXR1cm4gZ2V0RGVidWdnZXJSZWdpc3RyeSgpLmdldERlYnVnZ2VycygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSURlYnVnZ2VyIGdldERlYnVnZ2VyKFN0cmluZyBpZCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z2dlclJlZ2lzdHJ5KCkuZ2V0RGVidWdnZXIoaWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckluc3RhbGxbXSBnZXRQcm9jZXNzb3JzKCkKLQl7Ci0JCXJldHVybiBnZXRQcm9jZXNzb3JSZWdpc3RyeSgpLmdldFByb2Nlc3NvcnMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnN0YWxsW10gZ2V0UHJvY2Vzc29ycyhTdHJpbmcgdHlwZUlkKQotCXsKLQkJcmV0dXJuIGdldFByb2Nlc3NvclJlZ2lzdHJ5KCkuZ2V0UHJvY2Vzc29ycyh0eXBlSWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckluc3RhbGwgZ2V0UHJvY2Vzc29yKFN0cmluZyBwcm9jZXNzb3JJZCkKLQl7Ci0JCUlQcm9jZXNzb3JJbnN0YWxsW10gcHJvY2Vzc29ycyA9IGdldFByb2Nlc3NvcnMoKTsKLQkJZm9yIChJUHJvY2Vzc29ySW5zdGFsbCBpbnN0YWxsIDogcHJvY2Vzc29ycykKLQkJewotCQkJaWYgKGluc3RhbGwuZ2V0SWQoKS5lcXVhbHMocHJvY2Vzc29ySWQpKQotCQkJCXJldHVybiBpbnN0YWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckluc3RhbGwgZ2V0RGVmYXVsdFByb2Nlc3NvcigpCi0JewotCQlyZXR1cm4gZ2V0UHJvY2Vzc29yUmVnaXN0cnkoKS5nZXREZWZhdWx0UHJvY2Vzc29yKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXRKUkVEZWZhdWx0UHJvY2Vzc29yKCkKLQl7Ci0JCXJldHVybiBnZXRQcm9jZXNzb3JSZWdpc3RyeSgpLmdldEpSRURlZmF1bHRQcm9jZXNzb3IoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JUeXBlW10gZ2V0UHJvY2Vzc29yVHlwZXMoKQotCXsKLQkJcmV0dXJuIGdldFByb2Nlc3NvclR5cGVSZWdpc3RyeSgpLmdldFByb2Nlc3NvclR5cGVzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29yVHlwZVtdIGdldFByb2Nlc3NvclR5cGVzRXhjbEpSRURlZmF1bHQoKQotCXsKLQkJcmV0dXJuIGdldFByb2Nlc3NvclR5cGVSZWdpc3RyeSgpLmdldFByb2Nlc3NvclR5cGVzRXhjbEpSRURlZmF1bHQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JUeXBlIGdldFByb2Nlc3NvclR5cGUoU3RyaW5nIGlkKQotCXsKLQkJcmV0dXJuIGdldFByb2Nlc3NvclR5cGVSZWdpc3RyeSgpLmdldFByb2Nlc3NvclR5cGUoaWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2Nlc3Nvckludm9rZXIgZ2V0UHJvY2Vzc29ySW52b2tlcihTdHJpbmcgaW52b2tlcklkKQotCXsKLQkJcmV0dXJuIGdldEludm9rZXJSZWdpc3RyeSgpLmdldFByb2Nlc3Nvckludm9rZXIoaW52b2tlcklkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9jZXNzb3JJbnZva2VyW10gZ2V0UHJvY2Vzc29ySW52b2tlcnMoKQotCXsKLQkJcmV0dXJuIGdldEludm9rZXJSZWdpc3RyeSgpLmdldFByb2Nlc3Nvckludm9rZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKQotCXsKLQkJcmV0dXJuIExhdW5jaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUZlYXR1cmVQcmVmZXJlbmNlcyhNYXA8SVByb2Nlc3NvclR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHR5cGVGZWF0dXJlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkKLQkJewotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUUnVudGltZS41IiksIDEwMCk7IC8vJE5PTi1OTFMtMSQKLQkJCUZlYXR1cmVQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBGZWF0dXJlUHJlZmVyZW5jZXMoKTsKLQkJCU1hcDxTdHJpbmcsTWFwPFN0cmluZyxTdHJpbmc+PiB0eXBlSWRGZWF0dXJlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLFN0cmluZz4+KHR5cGVGZWF0dXJlcy5zaXplKCkpOwotCQkJZm9yIChJUHJvY2Vzc29yVHlwZSB0eXBlIDogdHlwZUZlYXR1cmVzLmtleVNldCgpKQotCQkJewotCQkJCU1hcDxTdHJpbmcsU3RyaW5nPiB2YWx1ZXMgPSB0eXBlRmVhdHVyZXMuZ2V0KHR5cGUpOwotCQkJCXR5cGVJZEZlYXR1cmVzLnB1dCh0eXBlLmdldElkKCksIHZhbHVlcyk7Ci0JCQl9Ci0JCQlwcmVmcy5zZXRUeXBlRmVhdHVyZXModHlwZUlkRmVhdHVyZXMpOwotCQkJU3RyaW5nIHhtbCA9IHByZWZzLmdldEFzWE1MKCk7Ci0JCQltb25pdG9yLndvcmtlZCg0MCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJWFNMVFJ1bnRpbWUuZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYU0xUUnVudGltZS5QUkVGX0ZFQVRVUkVfWE1MLCB4bWwpOwotCQkJbW9uaXRvci53b3JrZWQoMzApOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCVhTTFRSdW50aW1lLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJbW9uaXRvci53b3JrZWQoMzApOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUUnVudGltZS42IiksZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyhNYXA8SVByb2Nlc3NvclR5cGUsIFByb3BlcnRpZXM+IHR5cGVQcm9wZXJ0aWVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeQotCQl7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTFRSdW50aW1lLjciKSwgMTAwKTsgLy8kTk9OLU5MUy0xJAotCQkJT3V0cHV0UHJvcGVydHlQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBPdXRwdXRQcm9wZXJ0eVByZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKElQcm9jZXNzb3JUeXBlIHR5cGUgOiB0eXBlUHJvcGVydGllcy5rZXlTZXQoKSkKLQkJCXsKLQkJCQlwcmVmcy5zZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcyh0eXBlLmdldElkKCksIHR5cGVQcm9wZXJ0aWVzLmdldCh0eXBlKSk7Ci0JCQl9Ci0JCQlTdHJpbmcgeG1sID0gcHJlZnMuZ2V0QXNYTUwoKTsKLQkJCW1vbml0b3Iud29ya2VkKDQwKTsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQlYU0xUUnVudGltZS5nZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhTTFRSdW50aW1lLlBSRUZfT1VUUFVUX1BST1BFUlRJRVNfWE1MLCB4bWwpOwotCQkJbW9uaXRvci53b3JrZWQoMzApOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCVhTTFRSdW50aW1lLnNhdmVQcmVmZXJlbmNlcygpOwotCQkJbW9uaXRvci53b3JrZWQoMzApOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xUUnVudGltZS44IiksZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlUHJvY2Vzc29yUHJlZmVyZW5jZXMoSVByb2Nlc3Nvckluc3RhbGxbXSBpbnN0YWxscywgSVByb2Nlc3Nvckluc3RhbGwgZGVmYXVsdEluc3RhbGwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5Ci0JCXsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiWFNMVFJ1bnRpbWUuOSIpLCAxMDApOyAvLyROT04tTkxTLTEkCi0JCQlQcm9jZXNzb3JQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBQcm9jZXNzb3JQcmVmZXJlbmNlcygpOwotCQkJaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpCi0JCQkJcHJlZnMuc2V0RGVmYXVsdFByb2Nlc3NvcklkKGRlZmF1bHRJbnN0YWxsLmdldElkKCkpOwotCQkJcHJlZnMuc2V0UHJvY2Vzc29ycyhuZXcgQXJyYXlMaXN0PElQcm9jZXNzb3JJbnN0YWxsPihBcnJheXMuYXNMaXN0KGluc3RhbGxzKSkpOwotCQkJU3RyaW5nIHhtbCA9IHByZWZzLmdldEFzWE1MKCk7Ci0JCQltb25pdG9yLndvcmtlZCg0MCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJWFNMVFJ1bnRpbWUuZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYU0xUUnVudGltZS5QUkVGX1BST0NFU1NPUl9YTUwsIHhtbCk7Ci0JCQltb25pdG9yLndvcmtlZCgzMCk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJWFNMVFJ1bnRpbWUuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQltb25pdG9yLndvcmtlZCgzMCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCxNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTFRSdW50aW1lLjEwIiksZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBjcmVhdGVEZWZhdWx0T3V0cHV0UHJvcGVydGllcyhTdHJpbmcgdHlwZUlkKQotCXsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWlmIChKUkVfREVGQVVMVF9QUk9DRVNTT1JfVFlQRV9JRC5lcXVhbHModHlwZUlkKSkKLQkJCXByb3BzLnB1dCgiaW5kZW50IiwgInllcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZWxzZSBpZiAoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5YQUxBTl9UWVBFX0lELmVxdWFscyh0eXBlSWQpKQotCQkJcHJvcHMucHV0KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllbHNlIGlmIChYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBWE9OX1RZUEVfSUQuZXF1YWxzKHR5cGVJZCkpCi0JCQlwcm9wcy5wdXQoIntodHRwOi8vc2F4b24uc2YubmV0L31pbmRlbnQtc3BhY2VzIiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWVsc2UgaWYgKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuU0FYT05fMV8wX1RZUEVfSUQuZXF1YWxzKHR5cGVJZCkpCi0JCQlwcm9wcy5wdXQoIntodHRwOi8vc2F4b24uc2YubmV0L31pbmRlbnQtc3BhY2VzIiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBwcm9wczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoQXR0cmlidXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjNjODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoQXR0cmlidXRlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVUZGSVggPSAiLlRZUEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1VGRklYID0gIi5WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0JPT0xFQU4gPSAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lOVCA9ICJpbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ET1VCTEUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX09CSkVDVCA9ICJvYmplY3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHVyaTsKLQlwdWJsaWMgU3RyaW5nIHR5cGU7Ci0JcHVibGljIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBMYXVuY2hBdHRyaWJ1dGUoU3RyaW5nIHVyaSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCXRoaXMudXJpID0gdXJpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVkVmFsdWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbih2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpCi0JewotCQlyZXR1cm4gdXJpLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0JewotCQlpZiAob2JqIGluc3RhbmNlb2YgTGF1bmNoQXR0cmlidXRlKQotCQl7Ci0JCQlMYXVuY2hBdHRyaWJ1dGUgYXR0ID0gKExhdW5jaEF0dHJpYnV0ZSkgb2JqOwotCQkJcmV0dXJuIGF0dC51cmkuZXF1YWxzKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoRmVhdHVyZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hGZWF0dXJlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTMxNDY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hGZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hGZWF0dXJlcwotewotCXByaXZhdGUgZmluYWwgU2V0PExhdW5jaEF0dHJpYnV0ZT4gZmVhdHVyZXMgPSBuZXcgSGFzaFNldDxMYXVuY2hBdHRyaWJ1dGU+KCk7Ci0KLQlwdWJsaWMgU2V0PExhdW5jaEF0dHJpYnV0ZT4gZ2V0RmVhdHVyZXMoKQotCXsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmUoTGF1bmNoQXR0cmlidXRlIGZlYXR1cmUpCi0JewotCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIExhdW5jaEF0dHJpYnV0ZSBnZXRGZWF0dXJlKFN0cmluZyB1cmkpCi0JewotCQlmb3IgKEl0ZXJhdG9yPExhdW5jaEF0dHJpYnV0ZT4gaXRlciA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTGF1bmNoQXR0cmlidXRlIHR2ID0gKExhdW5jaEF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAodHYudXJpLmVxdWFscyh1cmkpKQotCQkJCXJldHVybiB0djsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlKFN0cmluZyB1cmkpCi0JewotCQlmb3IgKEl0ZXJhdG9yPExhdW5jaEF0dHJpYnV0ZT4gaXRlciA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTGF1bmNoQXR0cmlidXRlIGZlYXR1cmUgPSAoTGF1bmNoQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChmZWF0dXJlLnVyaS5lcXVhbHModXJpKSkKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0KLQkJRWxlbWVudCBmZWF0dXJlc0VsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIkZlYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZG9jLmFwcGVuZENoaWxkKGZlYXR1cmVzRWwpOwotCi0JCWZvciAoSXRlcmF0b3I8TGF1bmNoQXR0cmlidXRlPiBpdGVyID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlMYXVuY2hBdHRyaWJ1dGUgZmVhdHVyZSA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUudmFsdWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnQgZmVhdHVyZUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIkZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZUVsLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZlYXR1cmUudXJpKTsgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZUVsLnNldEF0dHJpYnV0ZSgidHlwZSIsIGZlYXR1cmUudHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZlYXR1cmVFbC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgZmVhdHVyZS52YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZlYXR1cmVzRWwuYXBwZW5kQ2hpbGQoZmVhdHVyZUVsKTsKLQkJfQotCi0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoRmVhdHVyZXMgZnJvbVhNTChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KGlucHV0U3RyZWFtKTsKLQotCQlMYXVuY2hGZWF0dXJlcyBwZGVmID0gbmV3IExhdW5jaEZlYXR1cmVzKCk7Ci0KLQkJRWxlbWVudCBmZWF0dXJlc0VsID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCU5vZGVMaXN0IGZlYXR1cmVFbHMgPSBmZWF0dXJlc0VsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlRWxzLmdldExlbmd0aCgpOyBpKyspCi0JCXsKLQkJCUVsZW1lbnQgZmVhdHVyZUVsID0gKEVsZW1lbnQpIGZlYXR1cmVFbHMuaXRlbShpKTsKLQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdHlwZSA9IGZlYXR1cmVFbC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZhbHVlID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJcGRlZi5hZGRGZWF0dXJlKG5ldyBMYXVuY2hBdHRyaWJ1dGUobmFtZSwgdHlwZSwgdmFsdWUpKTsKLQkJfQotCi0JCXJldHVybiBwZGVmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NTVkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludm9rZXIuY29uZmlnLlBpcGVsaW5lRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludm9rZXIuY29uZmlnLlRyYW5zZm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnZva2VyLmNvbmZpZy5UeXBlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklPdXRwdXRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29ySW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5JUHJvY2Vzc29yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5YU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTFRSdW50aW1lOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoSGVscGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBVUkwgc291cmNlOwotCXByaXZhdGUgZmluYWwgRmlsZSB0YXJnZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBMYXVuY2hGZWF0dXJlcyBmZWF0dXJlczsKLQlwcml2YXRlIGZpbmFsIExhdW5jaFBpcGVsaW5lIHBpcGVsaW5lOwotCXByaXZhdGUgZmluYWwgTGF1bmNoUHJvcGVydGllcyBvdXRwdXRQcm9wZXJ0aWVzOwotCXByaXZhdGUgaW50IHJlcXVlc3RQb3J0ID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZXZlbnRQb3J0ID0gLTE7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIG9wZW5GaWxlT25Db21wbGV0aW9uOwotCi0JcHVibGljIExhdW5jaEhlbHBlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJc291cmNlID0gaHlkcmF0ZVNvdXJjZUZpbGVVUkwoY29uZmlndXJhdGlvbik7Ci0JCXRhcmdldCA9IGh5ZHJhdGVPdXRwdXRGaWxlKGNvbmZpZ3VyYXRpb24pOwotCQlmZWF0dXJlcyA9IGh5ZHJhdGVGZWF0dXJlcyhjb25maWd1cmF0aW9uKTsKLQkJb3V0cHV0UHJvcGVydGllcyA9IGh5ZHJhdGVPdXRwdXRQcm9wZXJ0aWVzKGNvbmZpZ3VyYXRpb24pOwotCQlwaXBlbGluZSA9IGh5ZHJhdGVQaXBlbGluZShjb25maWd1cmF0aW9uKTsKLQkJb3BlbkZpbGVPbkNvbXBsZXRpb24gPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1BFTl9GSUxFLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJlcXVlc3RQb3J0KCkKLQl7Ci0JCWlmIChyZXF1ZXN0UG9ydCA9PSAtMSkKLQkJCXJlcXVlc3RQb3J0ID0gZmluZEZyZWVQb3J0KCk7Ci0JCXJldHVybiByZXF1ZXN0UG9ydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEV2ZW50UG9ydCgpCi0JewotCQlpZiAoZXZlbnRQb3J0ID09IC0xKQotCQkJZXZlbnRQb3J0ID0gZmluZEZyZWVQb3J0KCk7Ci0JCXJldHVybiBldmVudFBvcnQ7Ci0JfQotCi0JcHVibGljIExhdW5jaFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpCi0JewotCQlyZXR1cm4gb3V0cHV0UHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoRmVhdHVyZXMgZ2V0RmVhdHVyZXMoKQotCXsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBMYXVuY2hQaXBlbGluZSBnZXRQaXBlbGluZSgpCi0JewotCQlyZXR1cm4gcGlwZWxpbmU7Ci0JfQotCi0JcHVibGljIFVSTCBnZXRTb3VyY2UoKQotCXsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRUYXJnZXQoKQotCXsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQkvLyBlbnN1cmUgaXQgZXhpc3RzCi0JCQlmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCXdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSk7Ci0JCQlQaXBlbGluZURlZmluaXRpb24gcGRlZiA9IG5ldyBQaXBlbGluZURlZmluaXRpb24oKTsKLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGZlYXR1cmVzLmdldEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJewotCQkJCUxhdW5jaEF0dHJpYnV0ZSBhdHQgPSAoTGF1bmNoQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLQkJCQlwZGVmLmFkZEZlYXR1cmUobmV3IFR5cGVkVmFsdWUoYXR0LnVyaSwgYXR0LnR5cGUsIGF0dC52YWx1ZSkpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcGlwZWxpbmUuZ2V0VHJhbnNmb3JtRGVmcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlMYXVuY2hUcmFuc2Zvcm0gbHQgPSAoTGF1bmNoVHJhbnNmb3JtKSBpdGVyLm5leHQoKTsKLQkJCQlUcmFuc2Zvcm1EZWZpbml0aW9uIHRkZWYgPSBuZXcgVHJhbnNmb3JtRGVmaW5pdGlvbigpOwotCQkJCVVSTCB1cmwgPSBwYXRoVG9VUkwobHQuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJdGRlZi5zZXRTdHlsZXNoZWV0VVJMKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCQl0ZGVmLnNldFJlc29sdmVyQ2xhc3MobHQuZ2V0UmVzb2x2ZXIoKSk7Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IGx0LmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQkJCXsKLQkJCQkJTGF1bmNoQXR0cmlidXRlIGF0dCA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdGRlZi5hZGRQYXJhbWV0ZXIobmV3IFR5cGVkVmFsdWUoYXR0LnVyaSwgYXR0LnR5cGUsIGF0dC5nZXRSZXNvbHZlZFZhbHVlKCkpKTsKLQkJCQl9Ci0JCQkJLy8gc2V0IHRoZSBvdXRwdXQgcHJvcHMgZm9yIHRoZSBMQVNUIHRyYW5zZm9ybSBvbmx5Ci0JCQkJaWYgKCFpdGVyLmhhc05leHQoKSkKLQkJCQl7Ci0JCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBvdXRwdXRQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCQkJCXsKLQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKQotCQkJCQkJCXRkZWYuc2V0T3V0cHV0UHJvcGVydHkobmFtZSwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXBkZWYuYWRkVHJhbnNmb3JtRGVmKHRkZWYpOwotCQkJfQotCi0JCQlEb2N1bWVudCBkb2MgPSBwZGVmLnRvWE1MKCk7Ci0JCQlTdHJpbmcgcyA9IFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7Ci0JCQl3cml0ZXIud3JpdGUocyk7Ci0JCX0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLmdldFN0cmluZygiTGF1bmNoSGVscGVyLjAiKSwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJMYXVuY2hIZWxwZXIuMSIpLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIlRyYW5zZm9ybWVyRXhjZXB0aW9uIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlpZiAod3JpdGVyICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoUHJvcGVydGllcyBoeWRyYXRlT3V0cHV0UHJvcGVydGllcyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJTGF1bmNoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKLQkJYm9vbGVhbiB1c2VQcmVmZXJlbmNlUHJvcGVydGllcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9VU0VfUFJPUEVSVElFU19GUk9NX1BSRUZFUkVOQ0VTLCB0cnVlKTsKLQkJSVByb2Nlc3NvclR5cGUgZGVmYXVsdFR5cGUgPSBYU0xUUnVudGltZS5nZXRKUkVEZWZhdWx0UHJvY2Vzc29yKCkuZ2V0UHJvY2Vzc29yVHlwZSgpOwotCQlJUHJvY2Vzc29yVHlwZSBwdCA9IGdldFByb2Nlc3Nvckluc3RhbGwoY29uZmlndXJhdGlvbikuZ2V0UHJvY2Vzc29yVHlwZSgpOwotCQlpZiAodXNlUHJlZmVyZW5jZVByb3BlcnRpZXMpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgTGF1bmNoUHJvcGVydGllcygpOwotCQkJLy8gZ2V0IHRoZSBzdGFuZGFyZCBwcm9wZXJ0aWVzCi0JCQlmb3IgKE9iamVjdCBlbGVtZW50IDogZGVmYXVsdFR5cGUuZ2V0T3V0cHV0UHJvcGVydHlWYWx1ZXMoKS5lbnRyeVNldCgpKQotCQkJewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXByb3BlcnRpZXMuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOwotCQkJfQotCQkJLy8gZ2V0IHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgcHJvcGVydGllcwotCQkJaWYgKCFwdC5lcXVhbHMoZGVmYXVsdFR5cGUpKQotCQkJewotCQkJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBwdC5nZXRPdXRwdXRQcm9wZXJ0eVZhbHVlcygpLmVudHJ5U2V0KCkpCi0JCQkJewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbGVtZW50OwotCQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlwcm9wZXJ0aWVzLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9PVVRQVVRfUFJPUEVSVElFUywgKFN0cmluZykgbnVsbCk7Ci0JCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQkJcHJvcGVydGllcyA9IExhdW5jaFByb3BlcnRpZXMuZnJvbVhNTChpbnB1dFN0cmVhbSk7Ci0JCQkJLy8gZW5zdXJlIGFsbCBwcm9wZXJ0aWVzIHBlcnRhaW4gdG8gdGhlIGN1cnJlbnQgcHJvY2Vzc29yIHR5cGUKLQkJCQlJT3V0cHV0UHJvcGVydHlbXSBkZWZhdWx0UHJvcHMgPSBkZWZhdWx0VHlwZS5nZXRPdXRwdXRQcm9wZXJ0aWVzKCk7Ci0JCQkJSU91dHB1dFByb3BlcnR5W10gc3BlY2lmaWNQcm9wcyA9IHB0LmdldE91dHB1dFByb3BlcnRpZXMoKTsKLQkJCQlJT3V0cHV0UHJvcGVydHlbXSBwcm9wcyA9IG5ldyBJT3V0cHV0UHJvcGVydHlbc3BlY2lmaWNQcm9wcy5sZW5ndGggKyBkZWZhdWx0UHJvcHMubGVuZ3RoXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNwZWNpZmljUHJvcHMsIDAsIHByb3BzLCAwLCBzcGVjaWZpY1Byb3BzLmxlbmd0aCk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShkZWZhdWx0UHJvcHMsIDAsIHByb3BzLCBzcGVjaWZpY1Byb3BzLmxlbmd0aCwgZGVmYXVsdFByb3BzLmxlbmd0aCk7Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoSU91dHB1dFByb3BlcnR5IG91dHB1dFByb3BlcnR5IDogcHJvcHMpCi0JCQkJCXsKLQkJCQkJCWlmIChvdXRwdXRQcm9wZXJ0eS5nZXRVUkkoKS5lcXVhbHMoa2V5KSkKLQkJCQkJCXsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCXByb3BlcnRpZXMucmVtb3ZlUHJvcGVydHkoa2V5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JcHJpdmF0ZSBMYXVuY2hGZWF0dXJlcyBoeWRyYXRlRmVhdHVyZXMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUxhdW5jaEZlYXR1cmVzIGZlYXR1cmVzID0gbnVsbDsKLQkJYm9vbGVhbiB1c2VEZWZhdWx0RmVhdHVyZXMgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0ZFQVRVUkVTX0ZST01fUFJFRkVSRU5DRVMsIHRydWUpOwotCQlpZiAodXNlRGVmYXVsdEZlYXR1cmVzKQotCQl7Ci0JCQlmZWF0dXJlcyA9IG5ldyBMYXVuY2hGZWF0dXJlcygpOwotCQkJSVByb2Nlc3NvclR5cGUgcHQgPSBnZXRQcm9jZXNzb3JJbnN0YWxsKGNvbmZpZ3VyYXRpb24pLmdldFByb2Nlc3NvclR5cGUoKTsKLQkJCU1hcDw/LCA/PiBmdmFscyA9IHB0LmdldEZlYXR1cmVWYWx1ZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGZ2YWxzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyB1cmkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZShwdC5nZXRGZWF0dXJlcygpLCB1cmkpOwotCQkJCWZlYXR1cmVzLmFkZEZlYXR1cmUobmV3IExhdW5jaEF0dHJpYnV0ZSh1cmksIGZlYXR1cmUuZ2V0VHlwZSgpLCAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlTdHJpbmcgcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFhTTExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9GRUFUVVJFUywgKFN0cmluZykgbnVsbCk7Ci0JCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQkJZmVhdHVyZXMgPSBMYXVuY2hGZWF0dXJlcy5mcm9tWE1MKGlucHV0U3RyZWFtKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlKElGZWF0dXJlW10gZmVhdHVyZXMsIFN0cmluZyB1cmkpCi0JewotCQlmb3IgKElGZWF0dXJlIGZlYXR1cmUgOiBmZWF0dXJlcykKLQkJewotCQkJaWYgKGZlYXR1cmUuZ2V0VVJJKCkuZXF1YWxzKHVyaSkpCi0JCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGF1bmNoUGlwZWxpbmUgaHlkcmF0ZVBpcGVsaW5lKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlMYXVuY2hQaXBlbGluZSBwaXBlbGluZSA9IG51bGw7Ci0JCVN0cmluZyBzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BJUEVMSU5FLCAoU3RyaW5nKSBudWxsKTsKLQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkKLQkJewotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKTsKLQkJCXBpcGVsaW5lID0gTGF1bmNoUGlwZWxpbmUuZnJvbVhNTChpbnB1dFN0cmVhbSk7Ci0JCX0KLQkJcmV0dXJuIHBpcGVsaW5lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGh5ZHJhdGVTb3VyY2VGaWxlVVJMKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJUGF0aCBzb3VyY2VGaWxlID0gaHlkcmF0ZVNvdXJjZUZpbGUoY29uZmlndXJhdGlvbik7Ci0JCXJldHVybiBwYXRoVG9VUkwoc291cmNlRmlsZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElQYXRoIGh5ZHJhdGVTb3VyY2VGaWxlKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgc291cmNlRmlsZUV4cHIgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfSU5QVVRfRklMRSwgKFN0cmluZykgbnVsbCk7Ci0JCXJldHVybiBnZXRTdWJzdGl0dXRlZFBhdGgoc291cmNlRmlsZUV4cHIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFVSTCBwYXRoVG9VUkwoSVBhdGggc291cmNlRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJdXJsID0gc291cmNlRmlsZS50b0ZpbGUoKS50b1VSTCgpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBzb3VyY2VGaWxlLnRvU3RyaW5nKCksIGUpKTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBoeWRyYXRlT3V0cHV0RmlsZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVBhdGggb3V0cHV0RmlsZSA9IG51bGw7Ci0JCWJvb2xlYW4gdXNlRGVmYXVsdE91dHB1dEZpbGUgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEUsIHRydWUpOwotCQlpZiAoIXVzZURlZmF1bHRPdXRwdXRGaWxlKQotCQl7Ci0JCQlTdHJpbmcgb3V0cHV0RmlsZUV4cHIgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfT1VUUFVUX0ZJTEUsIChTdHJpbmcpIG51bGwpOwotCQkJb3V0cHV0RmlsZSA9IGdldFN1YnN0aXR1dGVkUGF0aChvdXRwdXRGaWxlRXhwcik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBUT0RPOiB3aGVyZSBpcyB0aGUgZGVmYXVsdCBvdXRwdXQgZmlsZT8gQW5kIG11c3Qgc2hhcmUgdGhpcyB3aXRoCi0JCQkvLyB0aGUgdmFsdWUgZGlzcGxheWVkIGluIHRoZSBVSS4KLQkJCW91dHB1dEZpbGUgPSAoSVBhdGgpIGh5ZHJhdGVTb3VyY2VGaWxlKGNvbmZpZ3VyYXRpb24pOwotCQkJb3V0cHV0RmlsZSA9IG91dHB1dEZpbGUuYWRkRmlsZUV4dGVuc2lvbigib3V0IikuYWRkRmlsZUV4dGVuc2lvbigieG1sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBvdXRwdXRGaWxlLnRvRmlsZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldFN1YnN0aXR1dGVkUGF0aChTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCXsKLQkJCXBhdGggPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24ocGF0aCk7Ci0JCQlyZXR1cm4gbmV3IFBhdGgocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvY2Vzc29ySW5zdGFsbCBnZXRQcm9jZXNzb3JJbnN0YWxsKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlib29sZWFuIHVzZURlZmF1bHRQcm9jZXNzb3IgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVVNFX0RFRkFVTFRfUFJPQ0VTU09SLCB0cnVlKTsKLQkJaWYgKHVzZURlZmF1bHRQcm9jZXNzb3IpCi0JCQlyZXR1cm4gWFNMVFJ1bnRpbWUuZ2V0RGVmYXVsdFByb2Nlc3NvcigpOwotCQlTdHJpbmcgcHJvY2Vzc29ySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPQ0VTU09SLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVByb2Nlc3Nvckluc3RhbGwgcHJvY2Vzc29yID0gWFNMVFJ1bnRpbWUuZ2V0UHJvY2Vzc29yKHByb2Nlc3NvcklkKTsKLQkJcmV0dXJuIHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZnJlZSBwb3J0IG51bWJlciBvbiBsb2NhbGhvc3QsIG9yIC0xIGlmIHVuYWJsZSB0byBmaW5kIGEgZnJlZQotCSAqIHBvcnQuCi0JICogCi0JICogQHJldHVybiBhIGZyZWUgcG9ydCBudW1iZXIgb24gbG9jYWxob3N0LCBvciAtMSBpZiB1bmFibGUgdG8gZmluZCBhIGZyZWUKLQkgKiAgICAgICAgIHBvcnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBmaW5kRnJlZVBvcnQoKQotCXsKLQkJU2VydmVyU29ja2V0IHNvY2tldCA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlzb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KDApOwotCQkJcmV0dXJuIHNvY2tldC5nZXRMb2NhbFBvcnQoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlmaW5hbGx5Ci0JCXsKLQkJCWlmIChzb2NrZXQgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRPcGVuRmlsZU9uQ29tcGxldGlvbigpCi0JewotCQlyZXR1cm4gb3BlbkZpbGVPbkNvbXBsZXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaFBpcGVsaW5lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoUGlwZWxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhMjk4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoUGlwZWxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5pbnRlcm5hbC5sYXVuY2hpbmcuTGF1bmNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoUGlwZWxpbmUKLXsKLQlwcml2YXRlIExpc3Q8TGF1bmNoVHJhbnNmb3JtPiB0cmFuc2Zvcm1EZWZzID0gbmV3IEFycmF5TGlzdDxMYXVuY2hUcmFuc2Zvcm0+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzIG91dHB1dFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0T3V0cHV0UHJvcGVydGllcygpCi0JewotCQlyZXR1cm4gb3V0cHV0UHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRPdXRwdXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotCXsKLQkJb3V0cHV0UHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBMaXN0PExhdW5jaFRyYW5zZm9ybT4gZ2V0VHJhbnNmb3JtRGVmcygpCi0JewotCQlyZXR1cm4gdHJhbnNmb3JtRGVmczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm1EZWZzKExpc3Q8TGF1bmNoVHJhbnNmb3JtPiB0cmFuc2Zvcm1zKQotCXsKLQkJdHJhbnNmb3JtRGVmcyA9IHRyYW5zZm9ybXM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVHJhbnNmb3JtRGVmKExhdW5jaFRyYW5zZm9ybSB0ZGVmKQotCXsKLQkJdGRlZi5zZXRQaXBlbGluZSh0aGlzKTsKLQkJdHJhbnNmb3JtRGVmcy5hZGQodGRlZik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJhbnNmb3JtRGVmKExhdW5jaFRyYW5zZm9ybSB0ZGVmKQotCXsKLQkJdHJhbnNmb3JtRGVmcy5yZW1vdmUodGRlZik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1hNTCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgeG1sID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0JCQlFbGVtZW50IHJvb3RFbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJQaXBlbGluZSIpOyAvLyROT04tTkxTLTEkCi0JCQlkb2MuYXBwZW5kQ2hpbGQocm9vdEVsKTsKLQotCQkJRWxlbWVudCBvcEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIk91dHB1dFByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJcm9vdEVsLmFwcGVuZENoaWxkKG9wRWwpOwotCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IG91dHB1dFByb3BlcnRpZXMuZW50cnlTZXQoKSkKLQkJCXsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbGVtZW50OwotCQkJCUVsZW1lbnQgcHJvcEVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9wRWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgKFN0cmluZykgZW50cnkuZ2V0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcHJvcEVsLnNldEF0dHJpYnV0ZSgidmFsdWUiLCAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW9wRWwuYXBwZW5kQ2hpbGQocHJvcEVsKTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvcjxMYXVuY2hUcmFuc2Zvcm0+IGl0ZXIgPSB0cmFuc2Zvcm1EZWZzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlMYXVuY2hUcmFuc2Zvcm0gdGRlZiA9IChMYXVuY2hUcmFuc2Zvcm0pIGl0ZXIubmV4dCgpOwotCQkJCUVsZW1lbnQgdGRlZkVsID0gdGRlZi5hc1hNTChkb2MpOwotCQkJCXJvb3RFbC5hcHBlbmRDaGlsZCh0ZGVmRWwpOwotCQkJfQotCi0JCQl4bWwgPSBQcmVmZXJlbmNlVXRpbC5zZXJpYWxpemVEb2N1bWVudChkb2MpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGF1bmNoaW5nUGx1Z2luLlBMVUdJTl9JRCwgMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMYXVuY2hpbmdQbHVnaW4uUExVR0lOX0lELCAwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQkJcmV0dXJuIHhtbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExhdW5jaFBpcGVsaW5lIGZyb21YTUwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7Ci0KLQkJTGF1bmNoUGlwZWxpbmUgcGRlZiA9IG5ldyBMYXVuY2hQaXBlbGluZSgpOwotCi0JCUVsZW1lbnQgcm9vdEVsID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCUVsZW1lbnQgb3BFbCA9IChFbGVtZW50KSByb290RWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk91dHB1dFByb3BlcnRpZXMiKS5pdGVtKDApOyAvLyROT04tTkxTLTEkCi0JCWlmIChvcEVsICE9IG51bGwpCi0JCXsKLQkJCU5vZGVMaXN0IHByb3BFbHMgPSBvcEVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJQcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BFbHMuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCXsKLQkJCQlFbGVtZW50IHByb3BFbCA9IChFbGVtZW50KSBwcm9wRWxzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwcm9wRWwuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdmFsdWUgPSBwcm9wRWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcGRlZi5hZGRPdXRwdXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlOb2RlTGlzdCB0cmFuc2Zvcm1FbHMgPSByb290RWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRyYW5zZm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNmb3JtRWxzLmdldExlbmd0aCgpOyBpKyspCi0JCXsKLQkJCUVsZW1lbnQgdHJhbnNmb3JtRWwgPSAoRWxlbWVudCkgdHJhbnNmb3JtRWxzLml0ZW0oaSk7Ci0JCQlMYXVuY2hUcmFuc2Zvcm0gdGRlZiA9IExhdW5jaFRyYW5zZm9ybS5mcm9tWE1MKHRyYW5zZm9ybUVsKTsKLQkJCXBkZWYuYWRkVHJhbnNmb3JtRGVmKHRkZWYpOwotCQl9Ci0KLQkJcmV0dXJuIHBkZWY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaFByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjBlNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL0xhdW5jaFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hQcm9wZXJ0aWVzCi17Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCXByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKQotCXsKLQkJcmV0dXJuIChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKQotCXsKLQkJcHJvcGVydGllcy5yZW1vdmUobmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1hNTCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCURvY3VtZW50IGRvYyA9IFByZWZlcmVuY2VVdGlsLmdldERvY3VtZW50KCk7Ci0KLQkJRWxlbWVudCBmZWF0dXJlc0VsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlkb2MuYXBwZW5kQ2hpbGQoZmVhdHVyZXNFbCk7Ci0KLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudCBmZWF0dXJlRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZUVsLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlmZWF0dXJlRWwuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZXNFbC5hcHBlbmRDaGlsZChmZWF0dXJlRWwpOwotCQl9Ci0KLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLnNlcmlhbGl6ZURvY3VtZW50KGRvYyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMYXVuY2hQcm9wZXJ0aWVzIGZyb21YTUwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlEb2N1bWVudCBkb2MgPSBQcmVmZXJlbmNlVXRpbC5nZXREb2N1bWVudChpbnB1dFN0cmVhbSk7Ci0KLQkJTGF1bmNoUHJvcGVydGllcyBwZGVmID0gbmV3IExhdW5jaFByb3BlcnRpZXMoKTsKLQotCQlFbGVtZW50IGZlYXR1cmVzRWwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJTm9kZUxpc3QgZmVhdHVyZUVscyA9IGZlYXR1cmVzRWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlRWxzLmdldExlbmd0aCgpOyBpKyspCi0JCXsKLQkJCUVsZW1lbnQgZmVhdHVyZUVsID0gKEVsZW1lbnQpIGZlYXR1cmVFbHMuaXRlbShpKTsKLQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBmZWF0dXJlRWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlwZGVmLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLQkJfQotCi0JCXJldHVybiBwZGVmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hUcmFuc2Zvcm0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9MYXVuY2hUcmFuc2Zvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlYTZiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9jb25maWcvTGF1bmNoVHJhbnNmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuY29uZmlnOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLlZhcmlhYmxlc1BsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoVHJhbnNmb3JtCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVFlQRSA9ICJyZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9UWVBFID0gImV4dGVybmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3R5bGVzaGVldDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwYXRoVHlwZTsKLQlwcml2YXRlIFN0cmluZyByZXNvbHZlcjsKLQlwcml2YXRlIGZpbmFsIFNldDxMYXVuY2hBdHRyaWJ1dGU+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaFNldDxMYXVuY2hBdHRyaWJ1dGU+KCk7Ci0JcHJpdmF0ZSBMYXVuY2hQaXBlbGluZSBwaXBlbGluZTsKLQotCS8qKgotCSAqIFRoZSBwYXRoIG1heSBiZSBhbiBJUmVzb3VyY2UgdG8gYSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UsIG9yIGFuIElQYXRoIHRvIGEKLQkgKiBmaWxlIG91dHNpZGUgb2YgdGhlIHdvcmtzcGFjZSAtIGRlcGVuZGluZyBvbiB0aGUgcGF0aFR5cGUuIFRoZSBwYXRoCi0JICogc2hvdWxkIGJlIGNyZWF0ZWQgdXNpbmcgSVBhdGgudG9Qb3J0YWJsZVN0cmluZygpLiBUaGUgcGF0aCBtYXkgYWxzbwotCSAqIGNvbnRhaW4gdmFyaWFibGVzIGRlZmluZWQgYnkgdGhlIFZhcmlhYmxlUGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIHBhdGhUeXBlCi0JICovCi0JcHVibGljIExhdW5jaFRyYW5zZm9ybShTdHJpbmcgcGF0aCwgU3RyaW5nIHBhdGhUeXBlKQotCXsKLQkJc3R5bGVzaGVldCA9IHBhdGg7Ci0JCXRoaXMucGF0aFR5cGUgPSBwYXRoVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU2V0PExhdW5jaEF0dHJpYnV0ZT4gZ2V0UGFyYW1ldGVycygpCi0JewotCQlyZXR1cm4gcGFyYW1ldGVyczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKExhdW5jaEF0dHJpYnV0ZSBwYXJhbWV0ZXIpCi0JewotCQlwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb2x2ZXIoKQotCXsKLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc29sdmVyKFN0cmluZyByZXNvbHZlcikKLQl7Ci0JCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgc3Vic3RpdHV0ZWRWYWx1ZSA9IFZhcmlhYmxlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nVmFyaWFibGVNYW5hZ2VyKCkucGVyZm9ybVN0cmluZ1N1YnN0aXR1dGlvbihzdHlsZXNoZWV0KTsKLQkJcmV0dXJuIFBhdGguZnJvbVBvcnRhYmxlU3RyaW5nKHN1YnN0aXR1dGVkVmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aFR5cGUoKQotCXsKLQkJcmV0dXJuIHBhdGhUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtICh3aXRoIGFueSBzdHJpbmcKLQkgKiBzdWJzaXR1dGlvbnMgYWxyZWFkeSBtYWRlKS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlQYXRoIHBhcnRpYWxQYXRoID0gZ2V0UGF0aCgpOwotCQlJUGF0aCBmdWxsUGF0aCA9IG51bGw7Ci0JCWlmIChSRVNPVVJDRV9UWVBFLmVxdWFscyhwYXRoVHlwZSkpCi0JCXsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXJ0aWFsUGF0aCk7Ci0JCQlmdWxsUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQllbHNlIGlmIChFWFRFUk5BTF9UWVBFLmVxdWFscyhwYXRoVHlwZSkpCi0JCXsKLQkJCWZ1bGxQYXRoID0gcGFydGlhbFBhdGg7Ci0JCX0KLQkJcmV0dXJuIGZ1bGxQYXRoOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGFzWE1MKERvY3VtZW50IGRvYykKLQl7Ci0JCUVsZW1lbnQgdGRlZkVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoIlRyYW5zZm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCXRkZWZFbC5zZXRBdHRyaWJ1dGUoInBhdGgiLCBzdHlsZXNoZWV0KTsgLy8kTk9OLU5MUy0xJAotCQl0ZGVmRWwuc2V0QXR0cmlidXRlKCJwYXRoVHlwZSIsIHBhdGhUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkKLQkJCXRkZWZFbC5zZXRBdHRyaWJ1dGUoInVyaVJlc29sdmVyIiwgcmVzb2x2ZXIpOyAvLyROT04tTkxTLTEkCi0JCUVsZW1lbnQgcGFyYW1zRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUGFyYW1ldGVycyIpOyAvLyROT04tTkxTLTEkCi0JCXRkZWZFbC5hcHBlbmRDaGlsZChwYXJhbXNFbCk7Ci0JCWZvciAoSXRlcmF0b3I8TGF1bmNoQXR0cmlidXRlPiBpdGVyID0gcGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCXsKLQkJCUxhdW5jaEF0dHJpYnV0ZSBwYXJhbSA9IChMYXVuY2hBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJRWxlbWVudCBwcm9wRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiUGFyYW1ldGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3BFbC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBwYXJhbS51cmkpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9wRWwuc2V0QXR0cmlidXRlKCJ0eXBlIiwgcGFyYW0udHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3BFbC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgcGFyYW0udmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJhbXNFbC5hcHBlbmRDaGlsZChwcm9wRWwpOwotCQl9Ci0JCXJldHVybiB0ZGVmRWw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMYXVuY2hUcmFuc2Zvcm0gZnJvbVhNTChFbGVtZW50IHRyYW5zZm9ybUVsKQotCXsKLQkJU3RyaW5nIHBhdGggPSB0cmFuc2Zvcm1FbC5nZXRBdHRyaWJ1dGUoInBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcGF0aFR5cGUgPSB0cmFuc2Zvcm1FbC5nZXRBdHRyaWJ1dGUoInBhdGhUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlMYXVuY2hUcmFuc2Zvcm0gdGRlZiA9IG5ldyBMYXVuY2hUcmFuc2Zvcm0ocGF0aCwgcGF0aFR5cGUpOwotCi0JCVN0cmluZyB1cmlSZXNvbHZlciA9IHRyYW5zZm9ybUVsLmdldEF0dHJpYnV0ZSgidXJpUmVzb2x2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZGVmLnNldFJlc29sdmVyKHVyaVJlc29sdmVyKTsKLQotCQlFbGVtZW50IHBhcmFtc0VsID0gKEVsZW1lbnQpIHRyYW5zZm9ybUVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJQYXJhbWV0ZXJzIikuaXRlbSgwKTsgLy8kTk9OLU5MUy0xJAotCQlOb2RlTGlzdCBwYXJhbUVscyA9IHBhcmFtc0VsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJQYXJhbWV0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtRWxzLmdldExlbmd0aCgpOyBpKyspCi0JCXsKLQkJCUVsZW1lbnQgcGFyYW1FbCA9IChFbGVtZW50KSBwYXJhbUVscy5pdGVtKGkpOwotCQkJU3RyaW5nIG5hbWUgPSBwYXJhbUVsLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdHlwZSA9IHBhcmFtRWwuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2YWx1ZSA9IHBhcmFtRWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQl0ZGVmLmFkZFBhcmFtZXRlcihuZXcgTGF1bmNoQXR0cmlidXRlKG5hbWUsIHR5cGUsIHZhbHVlKSk7Ci0JCX0KLQotCQlyZXR1cm4gdGRlZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQaXBlbGluZShMYXVuY2hQaXBlbGluZSBwaXBlbGluZSkKLQl7Ci0JCXRoaXMucGlwZWxpbmUgPSBwaXBlbGluZTsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoUGlwZWxpbmUgZ2V0UGlwZWxpbmUoKQotCXsKLQkJcmV0dXJuIHBpcGVsaW5lOwotCX0KLQotCS8qCi0JICogcHJpdmF0ZSBGaWxlIGdldFVSSVJlc29sdmVyRGlyZWN0b3J5KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JICogdGhyb3dzIENvcmVFeGNlcHRpb24geyBGaWxlIHJlc29sdmVyRGlyID0gbnVsbDsgU3RyaW5nIGJhc2VVUklUeXBlID0KLQkgKiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQkFTRV9VUklfVFlQRSwKLQkgKiBYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkJBU0VfVVJJX1dPUktJTkdfRElSX1JFTEFUSVZFKTsgaWYKLQkgKiAoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5CQVNFX1VSSV9BQlNPTFVURS5lcXVhbHMoYmFzZVVSSVR5cGUpKSB7Ci0JICogU3RyaW5nIHVyaURpciA9Ci0JICogY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0JBU0VfVVJJX0RJUkVDVE9SWSwKLQkgKiAoU3RyaW5nKW51bGwpOyBpZiAodXJpRGlyIT1udWxsKSB7IFN0cmluZyBwYXRoRXhwciA9Ci0JICogVmFyaWFibGVzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmdWYXJpYWJsZU1hbmFnZXIoKS5wZXJmb3JtU3RyaW5nU3Vic3RpdHV0aW9uKHVyaURpcik7Ci0JICogUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aEV4cHIpOyBpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsgRmlsZSBkaXIgPSBuZXcKLQkgKiBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsgaWYgKGRpci5pc0RpcmVjdG9yeSgpICYmIGRpci5leGlzdHMoKSkgeyByZXR1cm4KLQkgKiBkaXI7IH0gLy8gVGhpcyBtYXkgYmUgYSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCByZXR1cm5lZCBieSBhIHZhcmlhYmxlLiAvLwotCSAqIEhvd2V2ZXIgdmFyaWFibGUgcGF0aHMgc3RhcnQgd2l0aCBhIHNsYXNoIGFuZCB0aHVzIGFyZSB0aG91Z2h0IHRvIC8vIGJlCi0JICogYWJzb2x1dGUsIHNvIGZhbGwgdGhyb3VnaCB0byBiZWxvdyB9IElSZXNvdXJjZSByZXMgPQotCSAqIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsgaWYgKHJlcwotCSAqIGluc3RhbmNlb2YgSUNvbnRhaW5lciAmJiByZXMuZXhpc3RzKCkpIHJldHVybiByZXMuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkgKiBhYm9ydCgiVVJJIHBhdGggaXMgaW52YWxpZCIsbnVsbCwwKTsgfSB9IGVsc2UgaWYKLQkgKiAoWFNMTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5CQVNFX1VSSV9TVFlMRVNIRUVUX1JFTEFUSVZFLmVxdWFscyhiYXNlVVJJVHlwZSkpIHsKLQkgKiByZXNvbHZlckRpciA9IGdldFN0eWxlc2hlZXRSZWxhdGl2ZVVSSVJlc29sdmVyKGNvbmZpZ3VyYXRpb24pOyB9IC8vIG5vCi0JICogbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2Ygd29ya2luZ19kaXIgcmVsYXRpdmUgLSB0aGlzIGlzIHRoZSBkZWZhdWx0IGZvcgotCSAqIEpBWFAgc28gcmV0dXJuIG51bGwgcmV0dXJuIHJlc29sdmVyRGlyOyB9Ci0JICogCi0JICogcHJpdmF0ZSBGaWxlIGdldFN0eWxlc2hlZXRSZWxhdGl2ZVVSSVJlc29sdmVyKElMYXVuY2hDb25maWd1cmF0aW9uCi0JICogY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24geyBMaXN0IHN0eWxlc2hlZXRzID0KLQkgKiBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShYU0xMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU1RZTEVTSEVFVFNfTElTVCwoTGlzdCludWxsKTsKLQkgKiBpZiAoc3R5bGVzaGVldHMgPT0gbnVsbCB8fCBzdHlsZXNoZWV0cy5zaXplKCkgPT0gMCkgYWJvcnQoIk5vIHN0eWxlc2hlZXRzCi0JICogZGVmaW5lZCBmb3IgdGhpcyBsYXVuY2ggY29uZmlndXJhdGlvbiIsIG51bGwsIDApOyBlbHNlIHsgU3RyaW5nIHNoZWV0ID0KLQkgKiAoU3RyaW5nKXN0eWxlc2hlZXRzLmdldCgwKTsgU3RyaW5nIHBhdGhFeHByID0KLQkgKiBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24oc2hlZXQpOwotCSAqIFBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhFeHByKTsgaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7IEZpbGUgZmlsZSA9IG5ldwotCSAqIEZpbGUocGF0aC50b09TU3RyaW5nKCkpOyBpZiAoZmlsZS5leGlzdHMoKSkgeyBGaWxlIGRpciA9Ci0JICogZmlsZS5nZXRQYXJlbnRGaWxlKCk7IHJldHVybiBkaXI7IH0gLy8gVGhpcyBtYXkgYmUgYSB3b3Jrc3BhY2UgcmVsYXRpdmUKLQkgKiBwYXRoIHJldHVybmVkIGJ5IGEgdmFyaWFibGUuIC8vIEhvd2V2ZXIgdmFyaWFibGUgcGF0aHMgc3RhcnQgd2l0aCBhIHNsYXNoCi0JICogYW5kIHRodXMgYXJlIHRob3VnaHQgdG8gLy8gYmUgYWJzb2x1dGUgSVJlc291cmNlIHJlcyA9Ci0JICogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOyBJQ29udGFpbmVyCi0JICogcGFyZW50ID0gcmVzLmdldFBhcmVudCgpOyBpZiAocGFyZW50LmV4aXN0cygpKSByZXR1cm4KLQkgKiBwYXJlbnQuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsgYWJvcnQoIlN0eWxlc2hlZXQgcGF0aCBpcwotCSAqIGludmFsaWQiLG51bGwsMCk7IH0gZWxzZSB7IElSZXNvdXJjZSByZXMgPQotCSAqIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsgSUNvbnRhaW5lcgotCSAqIHBhcmVudCA9IHJlcy5nZXRQYXJlbnQoKTsgaWYgKHBhcmVudC5leGlzdHMoKSkgcmV0dXJuCi0JICogcGFyZW50LmdldExvY2F0aW9uKCkudG9GaWxlKCk7IGFib3J0KCJTdHlsZXNoZWV0IHBhdGggaXMKLQkgKiBpbnZhbGlkIixudWxsLDApOyB9IH0gcmV0dXJuIG51bGw7IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmU3YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZzsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5jb25maWcubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL2NvbmZpZy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODA4N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvY29uZmlnL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLUxhdW5jaEhlbHBlci4wPUZpbGUgbm90IGZvdW5kCi1MYXVuY2hIZWxwZXIuMT1JTyBFeGNlcHRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzVlYTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVhTTFRSdW50aW1lLjEwPUZhaWxlZCB0byBzYXZlIHByb2Nlc3MgcHJlZmVyZW5jZXMKLVhTTFRSdW50aW1lLjU9U2F2aW5nIGZlYXR1cmVzLi4uCi1YU0xUUnVudGltZS42PUZhaWxlZCB0byBzYXZlIGZlYXR1cmUgcHJlZmVyZW5jZXMKLVhTTFRSdW50aW1lLjc9U2F2aW5nIHByb3BlcnRpZXMuLi4KLVhTTFRSdW50aW1lLjg9RmFpbGVkIHRvIHNhdmUgb3V0cHV0IHByb3BlcnR5IHByZWZlcmVuY2VzCi1YU0xUUnVudGltZS45PVNhdmluZyBwcm9jZXNzb3JzLi4uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTQ3ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvSVhTTENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTTENvbnN0YW50cwotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfWFNMX0RFQlVHX01PREVMID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLlhTTERlYnVnTW9kZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnhzbExpbmVCcmVha3BvaW50TWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9JWFNMRGVidWdUYXJnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL0lYU0xEZWJ1Z1RhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTllNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL0lYU0xEZWJ1Z1RhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLQotcHVibGljIGludGVyZmFjZSBJWFNMRGVidWdUYXJnZXQgZXh0ZW5kcyBJRGVidWdUYXJnZXQKLXsKLQlYU0xWYXJpYWJsZSBnZXRWYXJpYWJsZShpbnQgdmFySWQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCUlTdGFja0ZyYW1lW10gZ2V0U3RhY2tGcmFtZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb247Ci0KLQl2b2lkIHN0ZXBJbnRvKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uOwotCi0Jdm9pZCBzdGVwT3ZlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCXZvaWQgc3RlcFJldHVybigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbjsKLQotCUlWYWx1ZSBnZXRWYXJpYWJsZVZhbHVlKFhTTFZhcmlhYmxlIHZhcmlhYmxlKSB0aHJvd3MgRGVidWdFeGNlcHRpb247CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOWEyN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWwubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTERlYnVnRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMRGVidWdFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NzZjNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMRGVidWdFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5EZWJ1Z0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGlzY29ubmVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0xEZWJ1Z0VsZW1lbnQgZXh0ZW5kcyBEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJRGlzY29ubmVjdAotewotCXB1YmxpYyBYU0xEZWJ1Z0VsZW1lbnQoSURlYnVnVGFyZ2V0IHRhcmdldCkKLQl7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2RlbElkZW50aWZpZXIoKQotCXsKLQkJcmV0dXJuIElYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8kTk9OLU5MUy0xJAotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyID09IElUZXJtaW5hdGUuY2xhc3MpIHsKLQkJCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0KCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmNhbkRpc2Nvbm5lY3QoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJZ2V0RGVidWdUYXJnZXQoKS5kaXNjb25uZWN0KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGlzY29ubmVjdGVkKCkKLQl7Ci0JCXJldHVybiBnZXREZWJ1Z1RhcmdldCgpLmlzRGlzY29ubmVjdGVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMRGVidWdUYXJnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTERlYnVnVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDJmYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMRGVidWdUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTWVtb3J5QmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnZ2VyLkRlYnVnQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuaW50ZXJuYWwubGF1bmNoaW5nLkxhdW5jaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5YU0xUTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLklQcm9jZXNzb3JJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmNvbmZpZy5MYXVuY2hIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0xEZWJ1Z1RhcmdldCBleHRlbmRzIFhTTERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElYU0xEZWJ1Z1RhcmdldCB7Ci0JcHJpdmF0ZSBmaW5hbCBieXRlW10gU1RBQ0tfRlJBTUVTX0xPQ0sgPSBuZXcgYnl0ZVswXTsKLQlwcml2YXRlIGZpbmFsIGJ5dGVbXSBWQUxVRV9NQVBfTE9DSyA9IG5ldyBieXRlWzBdOwotCXByaXZhdGUgZmluYWwgYnl0ZVtdIFdSSVRFX0xPQ0sgPSBuZXcgYnl0ZVswXTsKLQotCXByaXZhdGUgZmluYWwgaW50IENPTk5FQ1RfQVRURU1QVFMgPSA2MDsKLQlwcml2YXRlIGZpbmFsIGludCBDT05ORUNUX1dBSVQgPSAxMDAwOwotCi0JcHJpdmF0ZSBmaW5hbCBJUHJvY2VzcyBwcm9jZXNzOwotCXByaXZhdGUgZmluYWwgSUxhdW5jaCBsYXVuY2g7Ci0JcHJpdmF0ZSBYU0xUaHJlYWQgdGhyZWFkOwotCXByaXZhdGUgSVRocmVhZFtdIHRocmVhZHMgPSBuZXcgSVRocmVhZFswXTsKLQlwcml2YXRlIElTdGFja0ZyYW1lW10gc3RhY2tGcmFtZXNDYWNoZSA9IG5ldyBJU3RhY2tGcmFtZVswXTsKLQotCXByaXZhdGUgRXZlbnREaXNwYXRjaEpvYiBldmVudERpc3BhdGNoOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgWFNMVmFyaWFibGU+IHZhcmlhYmxlTWFwQ2FjaGUgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBYU0xWYXJpYWJsZT4oKTsKLQlwcml2YXRlIGZpbmFsIE1hcDxYU0xWYXJpYWJsZSwgWFNMVmFsdWU+IHZhbHVlTWFwQ2FjaGUgPSBuZXcgSGFzaE1hcDxYU0xWYXJpYWJsZSwgWFNMVmFsdWU+KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gc3VzcGVuZGVkOwotCXByaXZhdGUgYm9vbGVhbiB0ZXJtaW5hdGVkOwotCi0JcHJpdmF0ZSBTb2NrZXQgcmVxdWVzdFNvY2tldDsKLQlwcml2YXRlIFNvY2tldCBldmVudFNvY2tldDsKLQlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIHJlcXVlc3RSZWFkZXI7Ci0JcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBldmVudFJlYWRlcjsKLQlwcml2YXRlIFByaW50V3JpdGVyIHJlcXVlc3RXcml0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHN0YWxlOwotCi0JcHVibGljIFhTTERlYnVnVGFyZ2V0KElMYXVuY2ggbGF1bmNoLCBJUHJvY2VzcyBwcm9jZXNzLAotCQkJTGF1bmNoSGVscGVyIGxhdW5jaEhlbHBlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5sYXVuY2ggPSBsYXVuY2g7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMucmVxdWVzdFNvY2tldCA9IGF0dGVtcHRDb25uZWN0KGxhdW5jaEhlbHBlci5nZXRSZXF1ZXN0UG9ydCgpKTsKLQkJdGhpcy5ldmVudFNvY2tldCA9IGF0dGVtcHRDb25uZWN0KGxhdW5jaEhlbHBlci5nZXRFdmVudFBvcnQoKSk7Ci0KLQkJaWYgKCFwcm9jZXNzLmlzVGVybWluYXRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMuZXZlbnRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCQkJZXZlbnRTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSkpOwotCQkJCXRoaXMucmVxdWVzdFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihyZXF1ZXN0U29ja2V0Ci0JCQkJCQkuZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQkJCXRoaXMucmVxdWVzdFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJCQlyZXF1ZXN0U29ja2V0LmdldElucHV0U3RyZWFtKCkpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydChNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTERlYnVnVGFyZ2V0LjAiKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMudGhyZWFkID0gbmV3IFhTTFRocmVhZCh0aGlzKTsKLQkJCXRoaXMudGhyZWFkcyA9IG5ldyBJVGhyZWFkW10geyB0aHJlYWQgfTsKLQkJCXRoaXMuZXZlbnREaXNwYXRjaCA9IG5ldyBFdmVudERpc3BhdGNoSm9iKCk7Ci0JCQl0aGlzLmV2ZW50RGlzcGF0Y2guc2NoZWR1bGUoKTsKLQotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkKLQkJCQkJLmFkZEJyZWFrcG9pbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhYm9ydChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmICghZ2V0RGVidWdUYXJnZXQoKS5pc1Rlcm1pbmF0ZWQoKSkKLQkJCWdldERlYnVnVGFyZ2V0KCkuZ2V0UHJvY2VzcygpLnRlcm1pbmF0ZSgpOwotCQl0aHJvdyBuZXcgRGVidWdFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCUxhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsIERlYnVnUGx1Z2luLklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlLAotCQkJCWUpKTsKLQl9Ci0KLQlwcml2YXRlIFNvY2tldCBhdHRlbXB0Q29ubmVjdChpbnQgcG9ydCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTb2NrZXQgc29ja2V0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDT05ORUNUX0FUVEVNUFRTOyBpKyspIHsKLQkJCS8vIGJyZWFrIG91dCBpZiBwcm9jZXNzIGlzIHRlcm1pbmF0ZWQKLQkJCWlmIChwcm9jZXNzLmlzVGVybWluYXRlZCgpKQotCQkJCWJyZWFrOwotCQkJdHJ5IHsKLQkJCQlzb2NrZXQgPSBuZXcgU29ja2V0KAotCQkJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xEZWJ1Z1RhcmdldC4xIiksIHBvcnQpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWlmIChzb2NrZXQgIT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKENPTk5FQ1RfV0FJVCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNvY2tldCA9PSBudWxsICYmICFwcm9jZXNzLmlzVGVybWluYXRlZCgpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxhdW5jaGluZ1BsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xEZWJ1Z1RhcmdldC4yIikgKyBwb3J0ICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xEZWJ1Z1RhcmdldC4zIikgKyBDT05ORUNUX0FUVEVNUFRTICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xEZWJ1Z1RhcmdldC40IikpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHNvY2tldDsKLQl9Ci0KLQlwdWJsaWMgSVByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHVibGljIElUaHJlYWRbXSBnZXRUaHJlYWRzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRocmVhZHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVGhyZWFkcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aHJlYWRzICE9IG51bGwgJiYgdGhyZWFkcy5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVByb2Nlc3Nvckluc3RhbGwgaW5zdGFsbCA9IFhTTFRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUKLQkJCQkJCS5nZXRQcm9jZXNzb3JJbnN0YWxsKGdldExhdW5jaCgpCi0JCQkJCQkJCS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCksCi0JCQkJCQkJCUlMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpOwotCQkJCVN0cmluZyB0eXBlID0gaW5zdGFsbC5nZXRQcm9jZXNzb3JUeXBlKCkuZ2V0TGFiZWwoKTsKLQkJCQluYW1lID0gdHlwZSArICIgWyIgKyBpbnN0YWxsLmdldE5hbWUoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgRGVidWdFeGNlcHRpb24oZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNCcmVha3BvaW50KElCcmVha3BvaW50IGJyZWFrcG9pbnQpIHsKLQkJaWYgKGJyZWFrcG9pbnQuZ2V0TW9kZWxJZGVudGlmaWVyKCkuZXF1YWxzKAotCQkJCUlYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMKQotCQkJCSYmIGJyZWFrcG9pbnQgaW5zdGFuY2VvZiBJTGluZUJyZWFrcG9pbnQpIHsKLQkJCS8vIHRyeQotCQkJLy8gewotCQkJLy8gSUxpbmVCcmVha3BvaW50IGxiID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLQkJCS8vIElNYXJrZXIgbWFya2VyID0gbGIuZ2V0TWFya2VyKCk7Ci0JCQkvLyBmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPQotCQkJLy8gbGF1bmNoSGVscGVyLmdldFBpcGVsaW5lKCkuZ2V0VHJhbnNmb3JtRGVmcygpLml0ZXJhdG9yKCk7Ci0JCQkvLyBpdGVyLmhhc05leHQoKTspCi0JCQkvLyB7Ci0JCQkvLyBMYXVuY2hUcmFuc2Zvcm0gbHQgPSAoTGF1bmNoVHJhbnNmb3JtKSBpdGVyLm5leHQoKTsKLQkJCS8vIGlmIChtYXJrZXIuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpLmVxdWFscyhsdC5nZXRMb2NhdGlvbigpKSkKLQkJCS8vIHJldHVybiB0cnVlOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCS8vIHsKLQkJCS8vIExhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElEZWJ1Z1RhcmdldCBnZXREZWJ1Z1RhcmdldCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElMYXVuY2ggZ2V0TGF1bmNoKCkgewotCQlyZXR1cm4gbGF1bmNoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblRlcm1pbmF0ZSgpIHsKLQkJcmV0dXJuIGdldFByb2Nlc3MoKS5jYW5UZXJtaW5hdGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKSB7Ci0JCXJldHVybiB0ZXJtaW5hdGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAoV1JJVEVfTE9DSykgewotCQkJZ2V0UHJvY2VzcygpLnRlcm1pbmF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdW1lKCkgewotCQlyZXR1cm4gIWlzVGVybWluYXRlZCgpICYmIGlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3VzcGVuZCgpIHsKLQkJcmV0dXJuICFpc1Rlcm1pbmF0ZWQoKSAmJiAhaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpIHsKLQkJcmV0dXJuIHN1c3BlbmRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN1bWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1JFU1VNRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3VtZWQoaW50IGRldGFpbCkgewotCQlzdXNwZW5kZWQgPSBmYWxzZTsKLQkJdGhyZWFkLmZpcmVSZXN1bWVFdmVudChkZXRhaWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdXNwZW5kZWQoaW50IGRldGFpbCkgewotCQlzdXNwZW5kZWQgPSB0cnVlOwotCQl0aHJlYWQuZmlyZVN1c3BlbmRFdmVudChkZXRhaWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1NVU1BFTkQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJyZWFrcG9pbnRBZGRlZChJQnJlYWtwb2ludCBicmVha3BvaW50KSB7Ci0JCWlmIChzdXBwb3J0c0JyZWFrcG9pbnQoYnJlYWtwb2ludCkpIHsKLQkJCXRyeSB7Ci0JCQkJSUxpbmVCcmVha3BvaW50IGxiID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLQkJCQlpZiAoYnJlYWtwb2ludC5pc0VuYWJsZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBsYi5nZXRNYXJrZXIoKTsKLQkJCQkJCWlmIChtYXJrZXIgIT0gbnVsbCkgewotCQkJCQkJCVVSTCBmaWxlID0gbWFya2VyLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJLnRvRmlsZSgpLnRvVVJJKCkudG9VUkwoKTsKLQkJCQkJCQlzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX0FERF9CUkVBS1BPSU5UCi0JCQkJCQkJCQkrICIgIiArIGZpbGUgKyAiICIgKyBsYi5nZXRMaW5lTnVtYmVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYnJlYWtwb2ludFJlbW92ZWQoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCwgSU1hcmtlckRlbHRhIGRlbHRhKSB7Ci0JCWlmIChzdXBwb3J0c0JyZWFrcG9pbnQoYnJlYWtwb2ludCkpIHsKLQkJCXRyeSB7Ci0JCQkJSUxpbmVCcmVha3BvaW50IGxiID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLQkJCQlJTWFya2VyIG1hcmtlciA9IGxiLmdldE1hcmtlcigpOwotCQkJCWlmIChtYXJrZXIgIT0gbnVsbCkgewotCQkJCQlVUkwgZmlsZSA9IG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkKLQkJCQkJCQkudG9VUkkoKS50b1VSTCgpOwotCQkJCQlzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1JFTU9WRV9CUkVBS1BPSU5UCi0JCQkJCQkJKyAiICIgKyBmaWxlICsgIiAiICsgbGIuZ2V0TGluZU51bWJlcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGF1bmNoaW5nUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGJyZWFrcG9pbnRDaGFuZ2VkKElCcmVha3BvaW50IGJyZWFrcG9pbnQsIElNYXJrZXJEZWx0YSBkZWx0YSkgewotCQlpZiAoc3VwcG9ydHNCcmVha3BvaW50KGJyZWFrcG9pbnQpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChicmVha3BvaW50LmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWJyZWFrcG9pbnRBZGRlZChicmVha3BvaW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVha3BvaW50UmVtb3ZlZChicmVha3BvaW50LCBudWxsKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3QoKSB7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGRpc2Nvbm5lY3QKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQkvLyBUT0RPIGltcGxlbWVudCBkaXNjb25uZWN0Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjb25uZWN0ZWQoKSB7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGRpc2Nvbm5lY3QKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU3RvcmFnZVJldHJpZXZhbCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJTWVtb3J5QmxvY2sgZ2V0TWVtb3J5QmxvY2sobG9uZyBzdGFydEFkZHJlc3MsIGxvbmcgbGVuZ3RoKQotCQkJdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWR5KCkgewotCQlmaXJlQ3JlYXRpb25FdmVudCgpOwotCQlpbnN0YWxsRGVmZXJyZWRCcmVha3BvaW50cygpOwotCQl0cnkgewotCQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEFSVCk7Ci0JCX0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxsIGJyZWFrcG9pbnRzIHRoYXQgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBicmVha3BvaW50Ci0JICogbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zdGFsbERlZmVycmVkQnJlYWtwb2ludHMoKSB7Ci0JCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5nZXRCcmVha3BvaW50cygKLQkJCQkJCUlYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMKTsKLQkJZm9yIChJQnJlYWtwb2ludCBlbGVtZW50IDogYnJlYWtwb2ludHMpIHsKLQkJCWJyZWFrcG9pbnRBZGRlZChlbGVtZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXJtaW5hdGVkKCkgewotCQl0ZXJtaW5hdGVkID0gdHJ1ZTsKLQkJc3VzcGVuZGVkID0gdHJ1ZTsKLQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCkKLQkJCQkucmVtb3ZlQnJlYWtwb2ludExpc3RlbmVyKHRoaXMpOwotCi0JCXRocmVhZHMgPSBuZXcgSVRocmVhZFswXTsKLQotCQlmaXJlVGVybWluYXRlRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lcyBpbiB0aGUgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBJU3RhY2tGcmFtZVtdIGdldFN0YWNrRnJhbWVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChTVEFDS19GUkFNRVNfTE9DSykgewotCQkJaWYgKHN0YWxlKSB7Ci0JCQkJc3RhbGUgPSBmYWxzZTsKLQkJCQlTdHJpbmcgZnJhbWVzRGF0YSA9IHNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfU1RBQ0spOwotCQkJCVN0cmluZ1tdIGZyYW1lcyA9IGZyYW1lc0RhdGEuc3BsaXQoIlxcJFxcJFxcJCIpOyAvLyROT04tTkxTLTEkCi0JCQkJSVN0YWNrRnJhbWVbXSBzZiA9IG5ldyBJU3RhY2tGcmFtZVtmcmFtZXMubGVuZ3RoXTsKLQkJCQlMaXN0PElTdGFja0ZyYW1lPiBjdXJyZW50RnJhbWVzID0gQXJyYXlzCi0JCQkJCQkuYXNMaXN0KHN0YWNrRnJhbWVzQ2FjaGUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBkYXRhID0gZnJhbWVzW2ldOwotCQkJCQlYU0xTdGFja0ZyYW1lIGZyYW1lID0gbmV3IFhTTFN0YWNrRnJhbWUodGhyZWFkLCBkYXRhLCBpKTsKLQkJCQkJaW50IGluZGV4OwotCQkJCQlpZiAoKGluZGV4ID0gY3VycmVudEZyYW1lcy5pbmRleE9mKGZyYW1lKSkgIT0gLTEpIHsKLQkJCQkJCVhTTFN0YWNrRnJhbWUgY3VyciA9IChYU0xTdGFja0ZyYW1lKSBjdXJyZW50RnJhbWVzCi0JCQkJCQkJCS5nZXQoaW5kZXgpOwotCQkJCQkJY3Vyci5zZXRMaW5lTnVtYmVyKGZyYW1lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCQljdXJyLnNldFZhcmlhYmxlcyhmcmFtZS5nZXRWYXJpYWJsZXMoKSk7Ci0JCQkJCQlmcmFtZSA9IGN1cnI7Ci0JCQkJCX0KLQkJCQkJc2ZbZnJhbWVzLmxlbmd0aCAtIGkgLSAxXSA9IGZyYW1lOwotCQkJCX0KLQkJCQlzdGFja0ZyYW1lc0NhY2hlID0gc2Y7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhY2tGcmFtZXNDYWNoZTsKLQkJfQotCX0KLQotCS8qCi0JICogcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIGRhdGEpIHsKLQkgKiAKLQkgKiBTdHJpbmdbXSBzdHJpbmdzID0gZGF0YS5zcGxpdCgiXFx8Iik7IFN0cmluZyBmaWxlTmFtZSA9IHN0cmluZ3NbMF07IHRyeSB7Ci0JICogVVJMIHVybCA9IG5ldyBVUkwoZmlsZU5hbWUpOyBQYXRoIHAgPSBuZXcgUGF0aCh1cmwuZ2V0RmlsZSgpKTsKLQkgKiB4c2xGaWxlTmFtZSA9IChuZXcgUGF0aChmaWxlTmFtZSkpLmxhc3RTZWdtZW50KCk7Ci0JICogCi0JICogU3RyaW5nIGlkU3RyaW5nID0gc3RyaW5nc1sxXTsgaWQgPSBJbnRlZ2VyLnBhcnNlSW50KGlkU3RyaW5nKTsgU3RyaW5nIHBjCi0JICogPSBzdHJpbmdzWzJdOyBsaW5lTnVtYmVyID0gSW50ZWdlci5wYXJzZUludChwYyk7IFN0cmluZyBzYWZlbmFtZSA9Ci0JICogc3RyaW5nc1szXTsKLQkgKiAKLQkgKiBpbnQgdGhlSW5kZXg7IHdoaWxlICgodGhlSW5kZXggPSBzYWZlbmFtZS5pbmRleE9mKCIlQF9QSVBFX0AlIikpICE9IC0xKSB7Ci0JICogc2FmZW5hbWUgPSBzYWZlbmFtZS5zdWJzdHJpbmcoMCwgdGhlSW5kZXgpICsgInwiICsKLQkgKiBzYWZlbmFtZS5zdWJzdHJpbmcodGhlSW5kZXggKyAiJUBfUElQRV9AJSIubGVuZ3RoKCksIHNhZmVuYW1lLmxlbmd0aCgpKTsKLQkgKiB9Ci0JICogCi0JICogbmFtZSA9IHAubGFzdFNlZ21lbnQoKSArICIgIiArIHNhZmVuYW1lOwotCSAqIAotCSAqIGludCBudW1WYXJzID0gc3RyaW5ncy5sZW5ndGggLSA0OyB2YXJpYWJsZXMgPSBuZXcgSVZhcmlhYmxlW251bVZhcnNdOyBmb3IKLQkgKiAoaW50IGkgPSAwOyBpIDwgbnVtVmFyczsgaSsrKSB7IFN0cmluZyB2YWwgPSBzdHJpbmdzW2kgKyA0XTsgaW50IGluZGV4ID0KLQkgKiB2YWwubGFzdEluZGV4T2YoJyYnKTsgaW50IHNsb3ROdW1iZXIgPQotCSAqIEludGVnZXIucGFyc2VJbnQodmFsLnN1YnN0cmluZyhpbmRleCArIDEpKTsgdmFsID0gdmFsLnN1YnN0cmluZygwLAotCSAqIGluZGV4KTsgaW5kZXggPSB2YWwubGFzdEluZGV4T2YoJyYnKTsgU3RyaW5nIG5hbWUgPSB2YWwuc3Vic3RyaW5nKDAsCi0JICogaW5kZXgpOyBTdHJpbmcgc2NvcGUgPSB2YWwuc3Vic3RyaW5nKGluZGV4ICsgMSk7IHZhcmlhYmxlc1tpXSA9IG5ldwotCSAqIFhTTFZhcmlhYmxlKHRoaXMsIHNjb3BlLCBuYW1lLCBzbG90TnVtYmVyKTsgfSB9IGNhdGNoCi0JICogKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7IExhdW5jaGluZ1BsdWdpbi5sb2coZSk7IH0gfQotCSAqLwotCi0JcHJpdmF0ZSB2b2lkIHJlc3NldFN0YWNrRnJhbWVzQ2FjaGUoKSB7Ci0JCXN0YWxlID0gdHJ1ZTsKLQkJc3luY2hyb25pemVkIChWQUxVRV9NQVBfTE9DSykgewotCQkJdmFsdWVNYXBDYWNoZS5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xlIHN0ZXAgdGhlIGludGVycHJldGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBPdmVyKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEVQX09WRVIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBJbnRvKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc2VuZFJlcXVlc3QoRGVidWdDb25zdGFudHMuUkVRVUVTVF9TVEVQX0lOVE8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBSZXR1cm4oKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlzZW5kUmVxdWVzdChEZWJ1Z0NvbnN0YW50cy5SRVFVRVNUX1NURVBfUkVUVVJOKTsKLQl9Ci0KLQlwdWJsaWMgWFNMVmFyaWFibGUgZ2V0VmFyaWFibGUoaW50IHZhcklkKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHZhcmlhYmxlTWFwQ2FjaGUpIHsKLQkJCVhTTFZhcmlhYmxlIHZhciA9IHZhcmlhYmxlTWFwQ2FjaGUuZ2V0KHZhcklkKTsKLQkJCWlmICh2YXIgPT0gbnVsbCkgewotCQkJCXZhciA9IG5ldyBYU0xWYXJpYWJsZSh0aGlzLCB2YXJJZCk7Ci0JCQkJU3RyaW5nIHJlcyA9IHNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfVkFSSUFCTEUKLQkJCQkJCSsgIiAiICsgdmFySWQpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nW10gZGF0YSA9IHJlcy5zcGxpdCgiJiIpOyAvLyROT04tTkxTLTEkCi0JCQkJdmFyLnNldFNjb3BlKGRhdGFbMF0pOwotCQkJCXZhci5zZXROYW1lKGRhdGFbMV0pOwotCQkJCXZhcmlhYmxlTWFwQ2FjaGUucHV0KHZhcklkLCB2YXIpOwotCQkJfQotCQkJcmV0dXJuIHZhcjsKLQkJfQotCX0KLQotCXB1YmxpYyBJVmFsdWUgZ2V0VmFyaWFibGVWYWx1ZShYU0xWYXJpYWJsZSB2YXJpYWJsZSkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChWQUxVRV9NQVBfTE9DSykgewotCQkJWFNMVmFsdWUgdmFsdWUgPSAoWFNMVmFsdWUpIHZhbHVlTWFwQ2FjaGUuZ2V0KHZhcmlhYmxlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzU3VzcGVuZGVkKCkpIHsKLQkJCQkJU3RyaW5nIHJlcyA9IHNlbmRSZXF1ZXN0KERlYnVnQ29uc3RhbnRzLlJFUVVFU1RfVkFMVUUKLQkJCQkJCQkrICIgIiArIHZhcmlhYmxlLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1tdIGRhdGEgPSByZXMuc3BsaXQoIiYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgdHlwZSA9IGRhdGFbMF07Ci0JCQkJCVN0cmluZyB0aGV2YWw7Ci0JCQkJCWlmIChkYXRhLmxlbmd0aCA+IDEpCi0JCQkJCQl0aGV2YWwgPSBkYXRhWzFdOwotCQkJCQllbHNlCi0JCQkJCQl0aGV2YWwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IG5ldyBYU0xWYWx1ZSh0aGlzLCB0eXBlLCB0aGV2YWwpOwotCQkJCQl2YWx1ZU1hcENhY2hlLnB1dCh2YXJpYWJsZSwgdmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGFueXRoaW5nIGFzIGxvbmcgYXMgbm90IG51bGwhCi0JCQkJCXZhbHVlID0gbmV3IFhTTFZhbHVlKHRoaXMsICJHIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBzZW5kUmVxdWVzdChTdHJpbmcgcmVxdWVzdCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJlc3BvbnNlID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChXUklURV9MT0NLKSB7Ci0JCQlpZiAoRGVidWcuZGVidWdMYXVuY2hlcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUkVRVUVTVDogIiArIHJlcXVlc3QpOwotCQkJfQotCQkJcmVxdWVzdFdyaXRlci5wcmludGxuKHJlcXVlc3QpOwotCQkJcmVxdWVzdFdyaXRlci5mbHVzaCgpOwotCQkJdHJ5IHsKLQkJCQkvLyB3YWl0IGZvciByZXNwb25zZQotCQkJCXJlc3BvbnNlID0gcmVxdWVzdFJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChEZWJ1Zy5kZWJ1Z0xhdW5jaGVyKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUkVTUE9OU0U6ICIgKyByZXNwb25zZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWFib3J0KE1lc3NhZ2VzLmdldFN0cmluZygiWFNMRGVidWdUYXJnZXQuMTkiKSArIHJlcXVlc3QsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBicmVha3BvaW50SGl0KFN0cmluZyBldmVudCkgewotCQkvLyBkZXRlcm1pbmUgd2hpY2ggYnJlYWtwb2ludCB3YXMgaGl0LCBhbmQgc2V0IHRoZSB0aHJlYWQncyBicmVha3BvaW50Ci0JCWludCBsYXN0U3BhY2UgPSBldmVudC5sYXN0SW5kZXhPZignICcpOwotCQlpZiAobGFzdFNwYWNlID4gMCkgewotCQkJU3RyaW5nIGxpbmUgPSBldmVudC5zdWJzdHJpbmcobGFzdFNwYWNlICsgMSk7Ci0JCQlpbnQgbGluZU51bWJlciA9IEludGVnZXIucGFyc2VJbnQobGluZSk7Ci0JCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmdldEJyZWFrcG9pbnRzKAotCQkJCQkJCUlYU0xDb25zdGFudHMuSURfWFNMX0RFQlVHX01PREVMKTsKLQkJCWZvciAoSUJyZWFrcG9pbnQgYnJlYWtwb2ludCA6IGJyZWFrcG9pbnRzKSB7Ci0JCQkJaWYgKHN1cHBvcnRzQnJlYWtwb2ludChicmVha3BvaW50KSkgewotCQkJCQlpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIElMaW5lQnJlYWtwb2ludCkgewotCQkJCQkJSUxpbmVCcmVha3BvaW50IGxpbmVCcmVha3BvaW50ID0gKElMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKGxpbmVCcmVha3BvaW50LmdldExpbmVOdW1iZXIoKSA9PSBsaW5lTnVtYmVyKSB7Ci0JCQkJCQkJCXRocmVhZAotCQkJCQkJCQkJCS5zZXRCcmVha3BvaW50cyhuZXcgSUJyZWFrcG9pbnRbXSB7IGJyZWFrcG9pbnQgfSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1c3BlbmRlZChEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgRXZlbnREaXNwYXRjaEpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIEV2ZW50RGlzcGF0Y2hKb2IoKSB7Ci0JCQlzdXBlcihNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTERlYnVnVGFyZ2V0LjIwIikpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJU3RyaW5nIGV2ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICghaXNUZXJtaW5hdGVkKCkgJiYgZXZlbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWV2ZW50ID0gZXZlbnRSZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCQkJCXRocmVhZC5zZXRCcmVha3BvaW50cyhudWxsKTsKLQkJCQkJCXRocmVhZC5zZXRTdGVwcGluZyhmYWxzZSk7Ci0JCQkJCQlpZiAoZXZlbnQuZXF1YWxzKCJyZWFkeSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJcmVhZHkoKTsKLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQuZXF1YWxzKCJzdG9wcGVkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQl0ZXJtaW5hdGUoKTsKLQkJCQkJCQl9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChldmVudC5lcXVhbHMoInRlcm1pbmF0ZWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCXRlcm1pbmF0ZWQoKTsKLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQuc3RhcnRzV2l0aCgicmVzdW1lZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKGV2ZW50LmVuZHNXaXRoKCJzdGVwIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl7Ci0JCQkJCQkJCXRocmVhZC5zZXRTdGVwcGluZyh0cnVlKTsKLQkJCQkJCQkJcmVzdW1lZChEZWJ1Z0V2ZW50LlNURVBfT1ZFUik7Ci0JCQkJCQkJfSBlbHNlIGlmIChldmVudC5lbmRzV2l0aCgiY2xpZW50IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl7Ci0JCQkJCQkJCXJlc3VtZWQoRGVidWdFdmVudC5DTElFTlRfUkVRVUVTVCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJZGVidWdFdmVudE1zZyhldmVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChldmVudC5zdGFydHNXaXRoKCJzdXNwZW5kZWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCS8vIGNsZWFyIGRvd24gdGhlIGZyYW1lcyBzbyB0aGF0IHRoZXkgYXJlIHJlLWZldGNoZWQKLQkJCQkJCQlyZXNzZXRTdGFja0ZyYW1lc0NhY2hlKCk7Ci0JCQkJCQkJaWYgKGV2ZW50LmVuZHNXaXRoKCJjbGllbnQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXsKLQkJCQkJCQkJc3VzcGVuZGVkKERlYnVnRXZlbnQuQ0xJRU5UX1JFUVVFU1QpOwotCQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQuZW5kc1dpdGgoInN0ZXAiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXsKLQkJCQkJCQkJc3VzcGVuZGVkKERlYnVnRXZlbnQuU1RFUF9FTkQpOwotCQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQuaW5kZXhPZigiYnJlYWtwb2ludCIpID49IDApIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl7Ci0JCQkJCQkJCWJyZWFrcG9pbnRIaXQoZXZlbnQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWRlYnVnRXZlbnRNc2coZXZlbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZGVidWdFdmVudE1zZyhldmVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRlcm1pbmF0ZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBkZWJ1Z0V2ZW50TXNnKFN0cmluZyBldmVudCkgewotCQkJaWYgKERlYnVnLmRlYnVnTGF1bmNoZXIpIHsKLQkJCQkgU3lzdGVtLm91dC5wcmludGxuKCJEaWQgbm90IHVuZGVyc3RhbmQgZXZlbnQ6IiArIGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTExpbmVCcmVha3BvaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xMaW5lQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTdlMmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTExpbmVCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEJqb3JuIEZyZWVtYW4tQmVuc29uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuTGluZUJyZWFrcG9pbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0xMaW5lQnJlYWtwb2ludCBleHRlbmRzIExpbmVCcmVha3BvaW50Ci17Ci0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLQotCXB1YmxpYyBYU0xMaW5lQnJlYWtwb2ludCgpCi0JewotCX0KLQotCXB1YmxpYyBYU0xMaW5lQnJlYWtwb2ludChmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIGludCBsaW5lTnVtYmVyLCBmaW5hbCBpbnQgY2hhclN0YXJ0LCBmaW5hbCBpbnQgY2hhckVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKElYU0xDb25zdGFudHMuTUFSS0VSX0lEKTsKLQkJCQlzZXRNYXJrZXIobWFya2VyKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElCcmVha3BvaW50LklELCBnZXRNb2RlbElkZW50aWZpZXIoKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJQnJlYWtwb2ludC5FTkFCTEVELCBCb29sZWFuLlRSVUUpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlhTTExpbmVCcmVha3BvaW50LjAiKSArIHJlc291cmNlLmdldE5hbWUoKSArICIgW2xpbmU6ICIgKyBsaW5lTnVtYmVyICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbGluZU51bWJlcik7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKGNoYXJTdGFydCkpOwotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIoY2hhckVuZCkpOwotCi0JCQkJcmVnaXN0ZXIodHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0JCXJ1bihnZXRNYXJrZXJSdWxlKHJlc291cmNlKSwgcnVubmFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpbnQgbGluZSA9IHN1cGVyLmdldExpbmVOdW1iZXIoKTsKLQkJcmV0dXJuIGxpbmUgPT0gLTEgPyBsaW5lTnVtYmVyIDogbGluZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlcihib29sZWFuIHJlZ2lzdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJRGVidWdQbHVnaW4gcGx1Z2luID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcmVnaXN0ZXIpCi0JCXsKLQkJCXBsdWdpbi5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZEJyZWFrcG9pbnQodGhpcyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzZXRSZWdpc3RlcmVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxJZGVudGlmaWVyKCkKLQl7Ci0JCXJldHVybiBJWFNMQ29uc3RhbnRzLklEX1hTTF9ERUJVR19NT0RFTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xTdGFja0ZyYW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xTdGFja0ZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNDlhMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMU3RhY2tGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUmVnaXN0ZXJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmludGVybmFsLmxhdW5jaGluZy5MYXVuY2hpbmdQbHVnaW47Ci0KLS8qKgotICogWFNMIHN0YWNrIGZyYW1lLgotICovCi1wdWJsaWMgY2xhc3MgWFNMU3RhY2tGcmFtZSBleHRlbmRzIFhTTERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElTdGFja0ZyYW1lCi17Ci0JcHJpdmF0ZSBmaW5hbCBYU0xUaHJlYWQgeHNsVGhyZWFkOwotCXByaXZhdGUgaW50IGlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLQlwcml2YXRlIFN0cmluZyB4c2xGaWxlTmFtZTsKLQlwcml2YXRlIElWYXJpYWJsZVtdIHZhcmlhYmxlczsKLQotCXB1YmxpYyBYU0xTdGFja0ZyYW1lKFhTTFRocmVhZCB0aHJlYWQsIFN0cmluZyBkYXRhLCBpbnQgaW5kZXgpCi0JewotCQlzdXBlcih0aHJlYWQuZ2V0RGVidWdUYXJnZXQoKSk7Ci0JCXRoaXMueHNsVGhyZWFkID0gdGhyZWFkOwotCQlpbml0KGRhdGEsKElYU0xEZWJ1Z1RhcmdldCkgdGhyZWFkLmdldERlYnVnVGFyZ2V0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KFN0cmluZyBkYXRhLElYU0xEZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldCkKLQl7Ci0KLQkJU3RyaW5nW10gc3RyaW5ncyA9IGRhdGEuc3BsaXQoIlxcfCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBmaWxlTmFtZSA9IHN0cmluZ3NbMF07Ci0JCXRyeQotCQl7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChmaWxlTmFtZSk7Ci0JCQlQYXRoIHAgPSBuZXcgUGF0aCh1cmwuZ2V0RmlsZSgpKTsKLQkJCXhzbEZpbGVOYW1lID0gKG5ldyBQYXRoKGZpbGVOYW1lKSkubGFzdFNlZ21lbnQoKTsKLQotCQkJU3RyaW5nIGlkU3RyaW5nID0gc3RyaW5nc1sxXTsKLQkJCWlkID0gSW50ZWdlci5wYXJzZUludChpZFN0cmluZyk7Ci0JCQlTdHJpbmcgcGMgPSBzdHJpbmdzWzJdOwotCQkJbGluZU51bWJlciA9IEludGVnZXIucGFyc2VJbnQocGMpOwotCQkJU3RyaW5nIHNhZmVuYW1lID0gc3RyaW5nc1szXTsKLQotCQkJaW50IHRoZUluZGV4OwotCQkJd2hpbGUgKCh0aGVJbmRleCA9IHNhZmVuYW1lLmluZGV4T2YoIiVAX1BJUEVfQCUiKSkgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlzYWZlbmFtZSA9IHNhZmVuYW1lLnN1YnN0cmluZygwLCB0aGVJbmRleCkgKyAifCIgKyBzYWZlbmFtZS5zdWJzdHJpbmcodGhlSW5kZXggKyAiJUBfUElQRV9AJSIubGVuZ3RoKCksIHNhZmVuYW1lLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCW5hbWUgPSBwLmxhc3RTZWdtZW50KCkgKyAiICIgKyBzYWZlbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQl2YXJpYWJsZXMgPSBuZXcgWFNMVmFyaWFibGVbc3RyaW5ncy5sZW5ndGgtNF07Ci0JCQlmb3IgKGludCBpPTA7aTx2YXJpYWJsZXMubGVuZ3RoO2krKykKLQkJCXsKLQkJCQlpbnQgdmFySWQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZ3NbaSs0XSk7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlYU0xWYXJpYWJsZSB2YXIgPSBkZWJ1Z1RhcmdldC5nZXRWYXJpYWJsZSh2YXJJZCk7Ci0JCQkJCXZhcmlhYmxlc1tpXSA9IHZhcjsKLQkJCQl9Ci0JCQkJY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMYXVuY2hpbmdQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCUxhdW5jaGluZ1BsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVRocmVhZCBnZXRUaHJlYWQoKQotCXsKLQkJcmV0dXJuIHhzbFRocmVhZDsKLQl9Ci0KLQlwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gdmFyaWFibGVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIHZhcmlhYmxlcy5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRDaGFyU3RhcnQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENoYXJFbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuYW1lICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0xTdGFja0ZyYW1lLjUiKSArIGxpbmVOdW1iZXI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lzdGVyR3JvdXBbXSBnZXRSZWdpc3Rlckdyb3VwcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUmVnaXN0ZXJHcm91cHMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwSW50bygpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuU3RlcEludG8oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwT3ZlcigpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuU3RlcE92ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwUmV0dXJuKCkKLQl7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5TdGVwUmV0dXJuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdGVwcGluZygpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuaXNTdGVwcGluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBJbnRvKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS5zdGVwSW50bygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBPdmVyKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS5zdGVwT3ZlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBSZXR1cm4oKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldFRocmVhZCgpLnN0ZXBSZXR1cm4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN1bWUoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblJlc3VtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN1c3BlbmQoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblN1c3BlbmQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN1bWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldFRocmVhZCgpLnJlc3VtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldFRocmVhZCgpLnN1c3BlbmQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5UZXJtaW5hdGUoKQotCXsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblRlcm1pbmF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpCi0JewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuaXNUZXJtaW5hdGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVybWluYXRlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlnZXRUaHJlYWQoKS50ZXJtaW5hdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0aGlzIHN0YWNrIGZyYW1lIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKQotCXsKLQkJcmV0dXJuIHhzbEZpbGVOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotCXsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFhTTFN0YWNrRnJhbWUpCi0JCXsKLQkJCVhTTFN0YWNrRnJhbWUgc2YgPSAoWFNMU3RhY2tGcmFtZSkgb2JqOwotCQkJcmV0dXJuIHNmLmlkID09IGlkOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkKLQl7Ci0JCXJldHVybiBnZXRTb3VyY2VOYW1lKCkuaGFzaENvZGUoKSArIGlkOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0SWRlbnRpZmllcigpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikKLQl7Ci0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFyaWFibGVzKElWYXJpYWJsZVtdIHZhcmlhYmxlcykKLQl7Ci0JCXRoaXMudmFyaWFibGVzID0gdmFyaWFibGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFRocmVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODhlMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUaHJlYWQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0xUaHJlYWQgZXh0ZW5kcyBYU0xEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJVGhyZWFkCi17Ci0KLQkvKioKLQkgKiBCcmVha3BvaW50cyB0aGlzIHRocmVhZCBpcyBzdXNwZW5kZWQgYXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwcml2YXRlIElCcmVha3BvaW50W10gZkJyZWFrcG9pbnRzOwotCi0JLyoqCi0JICogV2hldGhlciB0aGlzIHRocmVhZCBpcyBzdGVwcGluZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmU3RlcHBpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgdGhyZWFkIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0Ci0JICovCi0JcHVibGljIFhTTFRocmVhZChJRGVidWdUYXJnZXQgdGFyZ2V0KQotCXsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgSVN0YWNrRnJhbWVbXSBnZXRTdGFja0ZyYW1lcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJaWYgKGlzU3VzcGVuZGVkKCkpCi0JCXsKLQkJCXJldHVybiAoKElYU0xEZWJ1Z1RhcmdldCkgZ2V0RGVidWdUYXJnZXQoKSkuZ2V0U3RhY2tGcmFtZXMoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiBuZXcgSVN0YWNrRnJhbWVbMF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdGFja0ZyYW1lcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdGFja0ZyYW1lIGdldFRvcFN0YWNrRnJhbWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCUlTdGFja0ZyYW1lW10gZnJhbWVzID0gZ2V0U3RhY2tGcmFtZXMoKTsKLQkJaWYgKGZyYW1lcy5sZW5ndGggPiAwKQotCQl7Ci0JCQlyZXR1cm4gZnJhbWVzWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuICJUaHJlYWRbMV0iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElCcmVha3BvaW50W10gZ2V0QnJlYWtwb2ludHMoKQotCXsKLQkJaWYgKGZCcmVha3BvaW50cyA9PSBudWxsKQotCQl7Ci0JCQlyZXR1cm4gbmV3IElCcmVha3BvaW50WzBdOwotCQl9Ci0JCXJldHVybiBmQnJlYWtwb2ludHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYnJlYWtwb2ludHMgdGhpcyB0aHJlYWQgaXMgc3VzcGVuZGVkIGF0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuCi0JICogCi0JICogQHBhcmFtIGJyZWFrcG9pbnRzCi0JICogICAgICAgICAgICB0aGUgYnJlYWtwb2ludHMgdGhpcyB0aHJlYWQgaXMgc3VzcGVuZGVkIGF0LCBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJyZWFrcG9pbnRzKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpCi0JewotCQlmQnJlYWtwb2ludHMgPSBicmVha3BvaW50czsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN1bWUoKQotCXsKLQkJcmV0dXJuIGlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3VzcGVuZCgpCi0JewotCQlyZXR1cm4gIWlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKQotCXsKLQkJcmV0dXJuIGdldERlYnVnVGFyZ2V0KCkuaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN1bWUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldERlYnVnVGFyZ2V0KCkucmVzdW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3VzcGVuZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJZ2V0RGVidWdUYXJnZXQoKS5zdXNwZW5kKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcEludG8oKQotCXsKLQkJcmV0dXJuIGlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcE92ZXIoKQotCXsKLQkJcmV0dXJuIGlzU3VzcGVuZGVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcFJldHVybigpCi0JewotCQlyZXR1cm4gaXNTdXNwZW5kZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N0ZXBwaW5nKCkKLQl7Ci0JCXJldHVybiBmU3RlcHBpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RlcEludG8oKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCSgoSVhTTERlYnVnVGFyZ2V0KSBnZXREZWJ1Z1RhcmdldCgpKS5zdGVwSW50bygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0ZXBPdmVyKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQkoKElYU0xEZWJ1Z1RhcmdldCkgZ2V0RGVidWdUYXJnZXQoKSkuc3RlcE92ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQkoKElYU0xEZWJ1Z1RhcmdldCkgZ2V0RGVidWdUYXJnZXQoKSkuc3RlcFJldHVybigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblRlcm1pbmF0ZSgpCi0JewotCQlyZXR1cm4gIWlzVGVybWluYXRlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpCi0JewotCQlyZXR1cm4gZ2V0RGVidWdUYXJnZXQoKS5pc1Rlcm1pbmF0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCWdldERlYnVnVGFyZ2V0KCkudGVybWluYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RlcHBpbmcoYm9vbGVhbiBzdGVwcGluZykKLQl7Ci0JCWZTdGVwcGluZyA9IHN0ZXBwaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmEzOTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL1hTTFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0xWYWx1ZSBleHRlbmRzIFhTTERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElWYWx1ZQotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZWYWx1ZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOwotCi0JcHVibGljIFhTTFZhbHVlKElEZWJ1Z1RhcmdldCB0YXJnZXQsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpCi0JewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZVR5cGVOYW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlpZiAoInN0cmluZyIuZXF1YWxzKHR5cGUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIiciK2ZWYWx1ZSsiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWxsb2NhdGVkKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gbmV3IElWYXJpYWJsZVswXTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNWYXJpYWJsZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xWYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvbW9kZWwvWFNMVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4MDVmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9YU0xWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotCi1wdWJsaWMgY2xhc3MgWFNMVmFyaWFibGUgZXh0ZW5kcyBYU0xEZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJVmFyaWFibGUKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9TQ09QRSA9ICJMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRVTk5FTF9TQ09QRSA9ICJUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTF9TQ09QRSA9ICJHIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc2NvcGU7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCXB1YmxpYyBYU0xWYXJpYWJsZShJRGVidWdUYXJnZXQgdGFyZ2V0LCBpbnQgaWQpCi0JewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIElWYWx1ZSBnZXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuICgoSVhTTERlYnVnVGFyZ2V0KSBnZXREZWJ1Z1RhcmdldCgpKS5nZXRWYXJpYWJsZVZhbHVlKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJdGhpcy5mTmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQkJaWYgKEdMT0JBTF9TQ09QRS5lcXVhbHMoc2NvcGUpKQotCQkJcmV0dXJuICJnbG9iYWwiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAibG9jYWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVmFsdWVDaGFuZ2VkKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJVmFsdWUgdmFsdWUpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbgotCXsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnlWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIERlYnVnRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5VmFsdWUoSVZhbHVlIHZhbHVlKSB0aHJvd3MgRGVidWdFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKQotCXsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKQotCXsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy9tb2RlbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjMwZDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL21vZGVsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVhTTERlYnVnVGFyZ2V0LjA9VW5hYmxlIHRvIGNvbm5lY3QgdG8gZGVidWdnZXIKLVhTTERlYnVnVGFyZ2V0LjE9bG9jYWxob3N0Ci1YU0xEZWJ1Z1RhcmdldC4xOT1SZXF1ZXN0IGZhaWxlZDogCi1YU0xEZWJ1Z1RhcmdldC4yPUNvdWxkIG5vdCBjb25uZWN0IHRvIHNvY2tldCAKLVhTTERlYnVnVGFyZ2V0LjIwPUV2ZW50IERpc3BhdGNoCi1YU0xEZWJ1Z1RhcmdldC4zPVwgYWZ0ZXIgCi1YU0xEZWJ1Z1RhcmdldC40PVwgYXR0ZW1wdHMKLVhTTExpbmVCcmVha3BvaW50LjA9TGluZSBCcmVha3BvaW50OiAKLVhTTFN0YWNrRnJhbWUuNT1cIGxpbmU6IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxNWExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWRlYnVnZ2VyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODRlZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjRhMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1ZztidW5kbGUtdmVyc2lvbj0iWzAuNS4wLDEuMC4wKSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9TYXhvbkZlYXR1cmVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vU2F4b25GZWF0dXJlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM0ODhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9TYXhvbkZlYXR1cmVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQUxMT1dfRVhURVJOQUxfRlVOQ1RJT05TPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9hbGxvdy1leHRlcm5hbC1mdW5jdGlvbnMKLUFMTE9XX0VYVEVSTkFMX0ZVTkNUSU9OUy5UWVBFPWJvb2xlYW4KLUFMTE9XX0VYVEVSTkFMX0ZVTkNUSU9OUy5ERVNDPXRydWUgaWYgdGhlIHN0eWxlc2hlZXQgYWxsb3dzIGV4dGVybmFsIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQuIERlZmF1bHQgaXMgdHJ1ZS4gVGhlIHNldHRpbmcgZmFsc2UgaXMgcmVjb21tZW5kZWQgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgdW50cnVzdGVkIHN0eWxlc2hlZXRzIG1heSBiZSBleGVjdXRlZC4gU2V0dGluZyB0aGlzIHZhbHVlIHRvIGZhbHNlICBhbHNvIGRpc2FibGVzIHVzZXItZGVmaW5lZCBleHRlbnNpb24gZWxlbWVudHMsIHRvZ2V0aGVyIHdpdGggdGhlIHdyaXRpbmcgb2YgbXVsdGlwbGUgb3V0cHV0IGZpbGVzLCBhbGwgb2Ygd2hpY2ggY2Fycnkgc2ltaWxhciBzZWN1cml0eSByaXNrcy4KLQotVFJBQ0VfRVhURVJOQUxfRlVOQ1RJT05TPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS90cmFjZS1leHRlcm5hbC1mdW5jdGlvbnMKLVRSQUNFX0VYVEVSTkFMX0ZVTkNUSU9OUy5UWVBFPWJvb2xlYW4KLVRSQUNFX0VYVEVSTkFMX0ZVTkNUSU9OUy5ERVNDPXRydWUgaWYgdGhlIHRyYWNpbmcgb2YgY2FsbHMgdG8gZXh0ZXJuYWwgSmF2YSBtZXRob2RzIGlzIHJlcXVpcmVkLiBEZWZhdWx0IGlzIGZhbHNlLiBUaGlzIHN3aXRjaCBpcyB1c2VmdWwgd2hlbiBhbmFseXppbmcgd2h5IFNheG9uIGZhaWxzIHRvIGZpbmQgYSBKYXZhIG1ldGhvZCB0byBtYXRjaCBhbiBleHRlbnNpb24gZnVuY3Rpb24gY2FsbCBpbiB0aGUgc3R5bGVzaGVldCwgb3Igd2h5IGl0IGNob29zZXMgb25lIG1ldGhvZCBvdmVyIGFub3RoZXIgd2hlbiBzZXZlcmFsIGFyZSBhdmFpbGFibGUuIFRoZSB0cmFjZSBvdXRwdXQgaXMgc2VudCB0byBTeXN0ZW0uZXJyLgotCi1USU1JTkc9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3RpbWluZwotVElNSU5HLlRZUEU9Ym9vbGVhbgotVElNSU5HLkRFU0M9dHJ1ZSBpZiBiYXNpYyB0aW1pbmcgaW5mb3JtYXRpb24gaXMgdG8gYmUgb3V0cHV0IHRvIHRoZSBzdGFuZGFyZCBlcnJvciBvdXRwdXQgc3RyZWFtLgotCi1UUkVFX01PREVMPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS90cmVlTW9kZWwKLVRSRUVfTU9ERUwuVFlQRT1pbnQKLVRSRUVfTU9ERUwuREVTQz1CdWlsZGVyLlNUQU5EQVJEX1RSRUUgb3IgQnVpbGRlci5USU5ZX1RSRUUuIFNlbGVjdHMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFNheG9uIHRyZWUgbW9kZWwuIFRoZSBkZWZhdWx0IGlzIEJ1aWxkZXIuVElOWV9UUkVFLgotCi1UUkFDRV9MSVNURU5FUj1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdHJhY2VMaXN0ZW5lcgotVFJBQ0VfTElTVEVORVIuVFlQRT1vYmplY3QKLVRSQUNFX0xJU1RFTkVSLkRFU0M9YW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5ldC5zZi5zYXhvbi50cmFjZS5UcmFjZUxpc3RlbmVyLiBUaGlzIG9iamVjdCB3aWxsIGJlIG5vdGlmaWVkIG9mIHNpZ25pZmljYW50IGV2ZW50cyBvY2N1cnJpbmcgZHVyaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiwgZm9yIHRyYWNpbmcgb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotCi1MSU5FX05VTUJFUklORz1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvbGluZW51bWJlcmluZwotTElORV9OVU1CRVJJTkcuVFlQRT1ib29sZWFuCi1MSU5FX05VTUJFUklORy5ERVNDPWluZGljYXRlcyB3aGV0aGVyIGxpbmUgbnVtYmVycyBhcmUgdG8gYmUgbWFpbnRhaW5lZCBmb3IgdGhlIHNvdXJjZSBkb2N1bWVudC4gVGhpcyB3aWxsIG5vdCBiZSBwb3NzaWJsZSBpZiB0aGUgc291cmNlIGRvY3VtZW50IGlzIHN1cHBsaWVkIGFzIGEgRE9NLiBUaGUgbGluZSBudW1iZXJzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIHRyYWNpbmcgaW50ZXJmYWNlLCBhbmQgYWxzbyB2aWEgdGhlIHNheG9uOmxpbmUtbnVtYmVyKCkgZXh0ZW5zaW9uIGZ1bmN0aW9uLgotCi1SRUNPVkVSWV9QT0xJQ1k9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3JlY292ZXJ5UG9saWN5Ci1SRUNPVkVSWV9QT0xJQ1kuVFlQRT1pbnQKLVJFQ09WRVJZX1BPTElDWS5ERVNDPUFuIEludGVnZXIuIEluZGljYXRlcyBob3cgZHluYW1pYyBlcnJvcnMgc2hvdWxkIGJlIGhhbmRsZWQuIE9uZSBvZiB0aGUgdmFsdWVzIChkZWZpbmVkIGFzIGNvbnN0YW50cyBpbiB0aGUgQ29udHJvbGxlciBjbGFzcykgUkVDT1ZFUl9TSUxFTlRMWSwgUkVDT1ZFUl9XSVRIX1dBUk5JTkdTLCBvciBET19OT1RfUkVDT1ZFUikuCi0KLU1FU1NBR0VfRU1JVFRFUl9DTEFTUz1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvbWVzc2FnZUVtaXR0ZXJDbGFzcwotTUVTU0FHRV9FTUlUVEVSX0NMQVNTLlRZUEU9Y2xhc3MKLU1FU1NBR0VfRU1JVFRFUl9DTEFTUy5ERVNDPVRoZSBmdWxsIG5hbWUgb2YgYSBzYXhvbiBlbWl0dGVyIGNsYXNzLiB0aGF0IGltcGxlbWVudHMgdGhlIG5ldC5zZi5zYXhvbi5vdXRwdXQuRW1pdHRlciBpbnRlcmZhY2U7IHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gZm9ybWF0IHRoZSBvdXRwdXQgb2YgdGhlIHhzbDptZXNzYWdlIGluc3RydWN0aW9uLgotCi1TT1VSQ0VfUEFSU0VSX0NMQVNTPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9zb3VyY2VQYXJzZXJDbGFzcwotU09VUkNFX1BBUlNFUl9DTEFTUy5UWVBFPWNsYXNzCi1TT1VSQ0VfUEFSU0VSX0NMQVNTLkRFU0M9VGhlIGZ1bGwgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgb3JnLnhtbC5zYXguWE1MUmVhZGVyIGludGVyZmFjZTsgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBwYXJzZSBzb3VyY2UgZG9jdW1lbnRzICh0aGF0IGlzLCB0aGUgcHJpbmNpcGFsIHNvdXJjZSBkb2N1bWVudCBwbHVzIGFueSBzZWNvbmRhcnkgc291cmNlIGRvY3VtZW50cyByZWFkIHVzaW5nIHRoZSBkb2N1bWVudCgpIGZ1bmN0aW9uKQotCi1TVFlMRV9QQVJTRVJfQ0xBU1M9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3N0eWxlUGFyc2VyQ2xhc3MKLVNUWUxFX1BBUlNFUl9DTEFTUy5UWVBFPWNsYXNzCi1TVFlMRV9QQVJTRVJfQ0xBU1MuREVTQz1UaGUgZnVsbCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBvcmcueG1sLnNheC5YTUxSZWFkZXIgaW50ZXJmYWNlOyB0aGUgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIHN0eWxlc2hlZXQgZG9jdW1lbnRzICh0aGF0IGlzLCB0aGUgcHJpbmNpcGFsIHN0eWxlc2hlZXQgbW9kdWxlIHBsdXMgYW55IHNlY29uZGFyeSBzb3VyY2UgZG9jdW1lbnRzIHJlYWQgdXNpbmcgeHNsOmluY2x1ZGUgb3IgeHNsOmltcG9ydCkKLQotT1VUUFVUX1VSSV9SRVNPTFZFUj1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvb3V0cHV0VVJJUmVzb2x2ZXIKLU9VVFBVVF9VUklfUkVTT0xWRVIuVFlQRT1vYmplY3QKLU9VVFBVVF9VUklfUkVTT0xWRVIuREVTQz1BbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmV0LnNmLnNheG9uLk91dHB1dFVSSVJlc29sdmVyOyB0aGlzIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gcmVzb2x2ZSBVUklzIG9mIHNlY29uZGFyeSByZXN1bHQgZG9jdW1lbnRzIHNwZWNpZmllZCBpbiB0aGUgaHJlZiBhdHRyaWJ1dGUgb2YgdGhlIHhzbDpyZXN1bHQtZG9jdW1lbnQgIGluc3RydWN0aW9uCi0KLURURF9WQUxJREFUSU9OPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS92YWxpZGF0aW9uCi1EVERfVkFMSURBVElPTi5UWVBFPWJvb2xlYW4KLURURF9WQUxJREFUSU9OLkRFU0M9SW5kaWNhdGVzIHdoZXRoZXIgdGhlIFhNTCBwYXJzZXIgc2hvdWxkIGJlIGFza2VkIHRvIHZhbGlkYXRlIHNvdXJjZSBkb2N1bWVudHMgYWdhaW5zdCB0aGVpciBEVEQuIFRoaXMgYXBwbGllcyB0byB0aGUgaW5pdGlhbCBzb3VyY2UgZG9jdW1lbnQgYW5kIGFueSBzb3VyY2UgZG9jdW1lbnRzIHJlYWQgdXNpbmcgdGhlIGRvY3VtZW50KCkgZnVuY3Rpb24sIHVubGVzcyBoYW5kbGVkIGJ5IGEgdXNlci13cml0dGVuIFVSSVJlc29sdmVyLgotCi1WQUxJREFUSU9OX1dBUk5JTkdTPWh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS92YWxpZGF0aW9uLXdhcm5pbmdzCi1WQUxJREFUSU9OX1dBUk5JTkdTLlRZUEU9Ym9vbGVhbgotVkFMSURBVElPTl9XQVJOSU5HUy5ERVNDPVRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHZhbGlkYXRpb24gZXJyb3JzIGluIHJlc3VsdCBkb2N1bWVudHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgZmF0YWwuIEJ5IGRlZmF1bHQgdGhleSBhcmUgZmF0YWw7IHdpdGggdGhpcyBvcHRpb24gc2V0LCB0aGV5IGFyZSB0cmVhdGVkIGFzIHdhcm5pbmdzLgotCi1TQ0hFTUFfVkFMSURBVElPTj1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvc2NoZW1hLXZhbGlkYXRpb24KLVNDSEVNQV9WQUxJREFUSU9OLlRZUEU9Ym9vbGVhbgotU0NIRU1BX1ZBTElEQVRJT04uREVTQz1UaGlzIGRldGVybWluZXMgd2hldGhlciBzb3VyY2UgZG9jdW1lbnRzIHNob3VsZCBiZSBwYXJzZWQgd2l0aCBzY2hlbWEtdmFsaWRhdGlvbiBlbmFibGVkLgotCi1WRVJTSU9OX1dBUk5JTkc9aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3ZlcnNpb24td2FybmluZwotVkVSU0lPTl9XQVJOSU5HLlRZUEU9Ym9vbGVhbgotVkVSU0lPTl9XQVJOSU5HLkRFU0M9VGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgYSB3YXJuaW5nIHNob3VsZCBiZSBvdXRwdXQgd2hlbiBydW5uaW5nIGFuIFhTTFQgMi4wIHByb2Nlc3NvciBhZ2FpbnN0IGFuIFhTTFQgMS4wIHN0eWxlc2hlZXQuIFRoZSBYU0xUIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhpcyB0byBiZSBkb25lIGJ5IGRlZmF1bHQuCi0KLU5BTUVfUE9PTD1odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvbmFtZVBvb2wKLU5BTUVfUE9PTC5UWVBFPW9iamVjdAotTkFNRV9QT09MLkRFU0M9QSBpbnN0YW5jZSBvZiBjbGFzcyBuZXQuc2Yuc2F4b24ub20uTmFtZVBvb2wuIEluZGljYXRlcyB0aGF0IHRoZSBzdXBwbGllZCBOYW1lUG9vbCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IChydW4tdGltZSkgTmFtZVBvb2wgYnkgYWxsIHN0eWxlc2hlZXRzIGNvbXBpbGVkICh1c2luZyBuZXdUZW1wbGF0ZXMoKSkgYWZ0ZXIgdGhpcyBjYWxsIG9uIHNldEF0dHJpYnV0ZS4gTm9ybWFsbHkgYSBzaW5nbGUgc3lzdGVtLWFsbG9jYXRlZCBOYW1lUG9vbCBpcyB1c2VkIGZvciBhbGwgc3R5bGVzaGVldHMgY29tcGlsZWQgd2hpbGUgdGhlIEphdmEgVk0gcmVtYWlucyBsb2FkZWQ7IHRoaXMgYXR0cmlidXRlIGFsbG93cyB1c2VyIGNvbnRyb2wgb3ZlciB0aGUgYWxsb2NhdGlvbiBvZiBOYW1lUG9vbHMuIE5vdGUgdGhhdCBzb3VyY2UgdHJlZXMgdXNlZCBhcyBpbnB1dCB0byBhIHRyYW5zZm9ybWF0aW9uIG11c3QgYmUgYnVpbHQgdXNpbmcgdGhlIHNhbWUgTmFtZVBvb2wgdGhhdCBpcyB1c2VkIHdoZW4gdGhlIHN0eWxlc2hlZXQgaXMgY29tcGlsZWQ6IHRoaXMgd2lsbCBoYXBwZW4gYXV0b21hdGljYWxseSBpZiB0aGUgaW5wdXQgdG8gYSB0cmFuc2Zvcm1hdGlvbiBpcyBzdXBwbGllZCBhcyBhIFNBWFNvdXJjZSBvciBTdHJlYW1Tb3VyY2UgYnV0IGl0IGlzIHVuZGVyIHVzZXIgY29udHJvbCBpZiB5b3UgYnVpbGQgdGhlIHNvdXJjZSB0cmVlIHlvdXJzZWxmLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL1NheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL1NheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc5MDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9TYXhvbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1JTkRFTlRfU1BBQ0VTPXtodHRwOi8vc2F4b24uc2YubmV0L31pbmRlbnQtc3BhY2VzCi1JTkRFTlRfU1BBQ0VTLkRFU0M9KGludGVnZXIgdmFsdWUpLkRlZmluZXMgdGhlIG51bWJlciBvZiBzcGFjZXMgdXNlZCBmb3IgaW5kZW50YXRpb24gb2Ygb3V0cHV0Ci0KLVVOREVDTEFSRV9OQU1FU1BBQ0VTPXtodHRwOi8vc2F4b24uc2YubmV0L311bmRlY2xhcmUtbmFtZXNwYWNlcwotVU5ERUNMQVJFX05BTUVTUEFDRVMuREVTQz1pbmNsdWRlLWNvbnRlbnQtdHlwZSA9ICJ5ZXMiIHwgIm5vIi4gVGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBpbiBYU0xUIDIuMC4gSW5kaWNhdGVzIFhNTCAxLjEgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBhcmUgdG8gYmUgb3V0cHV0LgotCi1DSEFSQUNURVJfUkVQUkVTRU5UQVRJT049e2h0dHA6Ly9zYXhvbi5zZi5uZXQvfWNoYXJhY3Rlci1yZXByZXNlbnRhdGlvbgotQ0hBUkFDVEVSX1JFUFJFU0VOVEFUSU9OLkRFU0M9KHJlcDFbO3JlcDJdKS4gSW5kaWNhdGVzIHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlcHJlc2VudGluZyBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBIVE1MIGFuZCBYTUwgb3V0cHV0LiByZXAxIGlzIGZvciBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAxMjgtMjU2LCByZXAyIGZvciB0aG9zZSBhYm92ZSAyNTYuCi0KLU5FWFRfSU5fQ0hBSU49e2h0dHA6Ly9zYXhvbi5zZi5uZXQvfW5leHQtaW4tY2hhaW4KLU5FWFRfSU5fQ0hBSU4uREVTQz0odXJpKS4gSW5kaWNhdGVzIHRoYXQgdGhlIG91dHB1dCBpcyB0byBiZSBwaXBlZCBpbnRvIGFub3RoZXIgWFNMVCBzdHlsZXNoZWV0IHRvIHBlcmZvcm0gYW5vdGhlciB0cmFuc2Zvcm1hdGlvbi4gVGhlIGF1eGlsaWFyeSBwcm9wZXJ0eSBORVhUX0lOX0NIQUlOX0JBU0VfVVJJIHJlY29yZHMgdGhlIGJhc2UgVVJJIG9mIHRoZSBzdHlsZXNoZWV0IGVsZW1lbnQgd2hlcmUgdGhpcyBhdHRyaWJ1dGUgd2FzIGZvdW5kLgotCi1UWVBFX0lORk9STUFUSU9OPXtodHRwOi8vc2F4b24uc2YubmV0L310eXBlLWluZm9ybWF0aW9uCi1UWVBFX0lORk9STUFUSU9OLkRFU0M9KG5vbmV8cHJlc2VydmV8c3RyaWN0fGxheCkuIEluZGljYXRlcyB0aGUgdmFsdWUgb2YgdGhlIHR5cGUtaW5mb3JtYXRpb24gYXR0cmlidXRlOiAibm9uZSIsICJwcmVzZXJ2ZSIsICJzdHJpY3QiLCAibGF4IgotCi1SRVFVSVJFX1dFTExfRk9STUVEPXtodHRwOi8vc2F4b24uc2YubmV0L31yZXF1aXJlLXdlbGwtZm9ybWVkCi1SRVFVSVJFX1dFTExfRk9STUVELkRFU0M9KHllc3xubykuIEluZGljYXRlcyB3aGV0aGVyIGEgdXNlci1zdXBwbGllZCBDb250ZW50SGFuZGxlciByZXF1aXJlcyB0aGUgc3RyZWFtIG9mIFNBWCBldmVudHMgdG8gYmUgd2VsbC1mb3JtZWQgKHRoYXQgaXMsIHRvIGhhdmUgYSBzaW5nbGUgZWxlbWVudCBub2RlIGFuZCBubyB0ZXh0IG5vZGVzIGFzIGNoaWxkcmVuIG9mIHRoZSByb290KS4gVGhlIGRlZmF1bHQgaXMgIm5vIi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjBhY2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy1kZWJ1Z2dlci8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgU2F4b25GZWF0dXJlcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIFNheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnNheG9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmMyZDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbgotQnVuZGxlLU5hbWUuMCA9IFhTTCBTYXhvbiBTdXBwb3J0IChJbmN1YmF0aW5nKQotcHJvY2Vzc29yVHlwZS5sYWJlbC4wID0gU2F4b24gKFhTTFQgMS4wKQotcHJvY2Vzc29yVHlwZS5sYWJlbC4xID0gU2F4b24gKFhTTFQgMi4wKQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY2ZTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yVHlwZSI+Ci0gICAgICA8cHJvY2Vzc29yVHlwZQotICAgICAgICAgICAgZmVhdHVyZVByb3BlcnRpZXM9IlNheG9uRmVhdHVyZXMucHJvcGVydGllcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnNheG9uLnByb2Nlc3NvclR5cGUiCi0gICAgICAgICAgICBsYWJlbD0iJXByb2Nlc3NvclR5cGUubGFiZWwuMCIKLSAgICAgICAgICAgIG91dHB1dFByb3BlcnRpZXM9IlNheG9uT3V0cHV0UHJvcGVydGllcy5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgdHJhbnNmb3JtZXJGYWN0b3J5PSJuZXQuc2Yuc2F4b24uVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCI+Ci0gICAgICA8L3Byb2Nlc3NvclR5cGU+Ci0gICAgICA8cHJvY2Vzc29yVHlwZQotICAgICAgICAgICAgZmVhdHVyZVByb3BlcnRpZXM9IlNheG9uRmVhdHVyZXMucHJvcGVydGllcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnNheG9uXzFfMC5wcm9jZXNzb3JUeXBlIgotICAgICAgICAgICAgbGFiZWw9IiVwcm9jZXNzb3JUeXBlLmxhYmVsLjEiCi0gICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzPSJTYXhvbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyRmFjdG9yeT0iY29tLmljbC5zYXhvbi5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIj4KLSAgICAgIDwvcHJvY2Vzc29yVHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9zcmMtZGVidWdnZXIvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbi9zcmMtZGVidWdnZXIvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2M2E1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wuc2F4b24vc3JjLWRlYnVnZ2VyL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1KdXN0IGEgcGxhY2Vob2xkZXIgdG8gZW5zdXJlIHNyYyBmb2xkZXIgYXBwZWFycy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWUyYTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveHBhdGgvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49IioqL3hzbC9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSIqKi94bWwvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49IioqL3NzZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0iKiovdmFsaWRhdGlvbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2ZDQ3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTkzNDE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jVGh1IE1hciAyMCAyMDowODoyMCBHTVQtMDU6MDAgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbj1yZXR1cm5fdGFnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJjM2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNvbnNvbGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5hcGFjaGUueGFsYW47YnVuZGxlLXZlcnNpb249IlsyLjcuMSwyLjguMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuNDAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTtidW5kbGUtdmVyc2lvbj0iWzAuNS4wLDEuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMywyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IjMuMy4xMDAiLAotIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWk7YnVuZGxlLXZlcnNpb249IlswLjUuMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5kb3VibGVjbGljaywKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnBlcnNwZWN0aXZlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuc3R5bGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnRlbXBsYXRlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkczt4LWludGVybmFsOj10cnVlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmYTU0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvWFNERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9YU0RGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwMGYxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2FuY2VzdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2FuY2VzdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3ZGI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9hbmNlc3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9kaXJlY3Rpb25hbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9kaXJlY3Rpb25hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTBiYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvZGlyZWN0aW9uYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvZmFtaWx5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2ZhbWlseS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MTdmM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvZmFtaWx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2Z1bmN0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL2Z1bmN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxZmQ2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9mdW5jdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9uZXdfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL25ld194bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZiNjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL25ld194bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvbmV3ZHRkX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiMWE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9uZXdkdGRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL29wZXJhdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC9vcGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTVkOWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL29wZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC92YXJpYWJsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC92YXJpYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDgzY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwvdmFyaWFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwveG1sX3BlcnNwZWN0aXZlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3htbF9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzliNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL2ljb25zL2Z1bGwveG1sX3BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3hzbHRfZmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvaWNvbnMvZnVsbC94c2x0X2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBlYjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9pY29ucy9mdWxsL3hzbHRfZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDg4ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBPcmFuZ2V2b2x0ICh3d3cub3Jhbmdldm9sdC5jb20pCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIExhcnMgR2Vyc21hbm4gKHd3dy5vcmFuZ2V2b2x0LmNvbSkgLSBYU0wgVUkgc3VwcG9ydAotIyAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAyMTUxMjYsIDIxMzg1MwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1YU0wgRWRpdG9yIGFuZCBWYWxpZGF0aW9uIChJbmN1YmF0aW5nKQotcGVyc3BlY3RpdmVOYW1lPVhNTAotcGFnZS5uYW1lLjAgPSBYU0wKLVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUgPSBYU0wgRG9jdW1lbnQgRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3YmRjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0JCTxwZXJzcGVjdGl2ZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wZXJzcGVjdGl2ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnBlcnNwZWN0aXZlLlhNTFBlcnNwZWN0aXZlRmFjdG9yeSIKLQkJCWljb249Imljb25zL2Z1bGwveG1sX3BlcnNwZWN0aXZlLmdpZiIgCi0JCQluYW1lPSIlcGVyc3BlY3RpdmVOYW1lIj4KLQkJPC9wZXJzcGVjdGl2ZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvciBuYW1lPSJYU0wgRWRpdG9yIiAKLQkJCWljb249Imljb25zL2Z1bGwveHNsdF9maWxlLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiCi0JCQlkZWZhdWx0PSJ0cnVlIgotCQkJZXh0ZW5zaW9ucz0ieHNsLHhzbHQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YU0xFZGl0b3IiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZyBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgICA8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YU0xFZGl0b3IiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YU0xFZGl0b3IiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSI+Ci0JCTwvc291cmNlVmlld2VyQ29uZmlndXJhdGlvbj4KLQkgICAgPGRvdWJsZUNsaWNrU3RyYXRlZ3kKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZG91YmxlY2xpY2suWFNMRG91YmxlQ2xpY2tTdHJhdGVneSIKLSAgICAgICAgICAgdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueHNsLlhTTF9YUEFUSCI+Ci0JICAgIDwvZG91YmxlQ2xpY2tTdHJhdGVneT4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5uYXZpZ2F0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmNsZWFudXAsIG9yZy5lY2xpcHNlLndzdC54bWwuY29tbWVudHMsIG9yZy5lY2xpcHNlLndzdC54bWwuc2VsZWN0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmRlcGVuZGVuY2llcywgb3JnLmVjbGlwc2Uud3N0LnhtbC5ncmFtbWFyLCBvcmcuZWNsaXBzZS53c3QueG1sLmV4cGFuZCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5vY2N1cnJlbmNlcyIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLSAgICAgICAgPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotICAgICAgICAgICAgdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlLCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlbXBsYXRlLnByZWZlcmVuY2VQYWdlLCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByZWZlcmVuY2VzLlZhbGlkYXRpb24sIG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuWFBhdGhQcmVmZXJlbmNlUGFnZSwgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5YUGF0aCIKLSAgICAgICAgICAgIHRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSIvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8d2l6YXJkIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTTEZpbGVXaXphcmQiCi0JCQlmaW5hbFBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnBlcnNwZWN0aXZlIiAKLQkJCWljb249Imljb25zL2Z1bGwveHNsdF9maWxlLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHMuTmV3U3R5bGVzaGVldFdpemFyZCIKLQkJCW5hbWU9IlhTTCIgCi0JCQlwcmVmZXJyZWRQZXJzcGVjdGl2ZXM9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucGVyc3BlY3RpdmUiPgotCQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIG5ldyBYU0wgU3R5bGVzaGVldDwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJPC9zZWxlY3Rpb24+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gWFNMIHRlbXBsYXRlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYU0wiCi0JCQlpZD0ieHNsX25ldyIgbmFtZT0iTmV3IFhTTCI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxpbmNsdWRlIGZpbGU9InRlbXBsYXRlcy9maWxlX3RlbXBsYXRlcy54bWwiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZSBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5NYWluUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2UiIAotCQkJbmFtZT0iJXBhZ2UubmFtZS4wIiAvPgotCQk8cGFnZSBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0xUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkudGVtcGxhdGUucHJlZmVyZW5jZVBhZ2UiIAotCQkJbmFtZT0iVGVtcGxhdGVzIj4KLQkJPC9wYWdlPgotCi0JCTxwYWdlIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByZWZlcmVuY2VzLkJhc2VQcmVmZXJlbmNlUGFnZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnByZWZlcmVuY2VzLlZhbGlkYXRpb24iIAotCQkJbmFtZT0iVmFsaWRhdGlvbiI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yIHNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTCI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueHNsc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5YU0xfWFBBVEgiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3Igc2NvcGU9InBhcnRpYWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTTE1hcmt1cFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnZhbGlkYXRvci5tYXJrdXB2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhzbHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIgLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIgLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5YU0xfWFBBVEgiIC8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0gPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgotICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnBlcnNwZWN0aXZlIj4KLSAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCI+Ci0gICAgICAgPC9uZXdXaXphcmRTaG9ydGN1dD4KLSAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1N0eWxlc2hlZXRXaXphcmQiPgotICAgICAgIDwvbmV3V2l6YXJkU2hvcnRjdXQ+Ci0gICAgICAgPG5ld1dpemFyZFNob3J0Y3V0Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCI+Ci0gICAgICAgPC9uZXdXaXphcmRTaG9ydGN1dD4KLSAgICAgICA8bmV3V2l6YXJkU2hvcnRjdXQKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiPgotICAgICAgIDwvbmV3V2l6YXJkU2hvcnRjdXQ+Ci0gICAgICAgPG5ld1dpemFyZFNob3J0Y3V0Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYU0RXaXphcmQiPgotICAgICAgIDwvbmV3V2l6YXJkU2hvcnRjdXQ+Ci0gICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCSA8ZXh0ZW5zaW9uCi0JICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JICAgICAgIDxjb21tb25XaXphcmQKLQkgICAgICAgICAgICAgdHlwZT0ibmV3IgotCSAgICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIj4KLQkgICAgICAgICAgPGVuYWJsZW1lbnQ+PC9lbmFibGVtZW50PgotCSAgICAgICA8L2NvbW1vbldpemFyZD4KLQkgICAgICAgPGNvbW1vbldpemFyZAotCSAgICAgICAgICAgICB0eXBlPSJuZXciCi0JICAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuTmV3WE1MV2l6YXJkIj4KLQkgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0JICAgICAgICAgIAotCSAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0JICAgICAgIDwvY29tbW9uV2l6YXJkPgotCSAgICAgICA8Y29tbW9uV2l6YXJkCi0JICAgICAgICAgICAgIHR5cGU9Im5ldyIKLQkgICAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdTdHlsZXNoZWV0V2l6YXJkIj4KLQkgICAgICAgICAgPGVuYWJsZW1lbnQ+PC9lbmFibGVtZW50PgotCSAgICAgICA8L2NvbW1vbldpemFyZD4KLQkgICAgICAgPGNvbW1vbldpemFyZAotCSAgICAgICAgICAgICB0eXBlPSJuZXciCi0JICAgICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIj4KLQkgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0JICAgICAgICAgIDwvZW5hYmxlbWVudD4KLQkgICAgICAgPC9jb21tb25XaXphcmQ+Ci0JICAgICAgIDxjb21tb25XaXphcmQKLQkgICAgICAgICAgICAgdHlwZT0ibmV3IgotCSAgICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiPgotCSAgICAgICAgICA8ZW5hYmxlbWVudD48L2VuYWJsZW1lbnQ+Ci0JICAgICAgIDwvY29tbW9uV2l6YXJkPgotCSA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotICAgICA8aGFuZGxlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5oYW5kbGVycy5PcGVuRGVjbGFyYXRpb25IYW5kbGVyIgotICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkub3Blbi5maWxlLmZyb20uc291cmNlIj4KLSAgICAgPC9oYW5kbGVyPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotICAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5FZGl0b3JDb250ZXh0P2JlZm9yZT1hZGRpdGlvbnMiPgotICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkub3Blbi5maWxlLmZyb20uc291cmNlIgotICAgICAgICAgICAgICBpZD0ib3BlblNlbGVjdGlvbiIKLSAgICAgICAgICAgICAgbGFiZWw9Ik9wZW4gU2VsZWN0aW9uIgotICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgdG9vbHRpcD0iT3BlbiBTZWxlY3Rpb24iPgotICAgICAgICAgICA8dmlzaWJsZVdoZW4KLSAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgIDwvY29tbWFuZD4KLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgICBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS51aS5tYWluLnRvb2xiYXI/YWZ0ZXI9YWRkaXRpb25zIj4KLSAgICAgICAgPHRvb2xiYXIKLSAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuZGVzaWduLk5ld0ZpbGVUb29sQmFyIj4KLSAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC50b29sYmFyLnNlcGFyYXRvci4xIgotICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQiCi0gICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvbmV3X3htbC5naWYiCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLm5ld1hNTEZpbGUiCi0gICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICB0b29sdGlwPSJOZXcgWE1MIEZpbGUiPgotICAgICAgICAgICAgIDxwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICBuYW1lPSJuZXdXaXphcmRJZCIKLSAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCI+Ci0gICAgICAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5hY3RpdmVQZXJzcGVjdGl2ZSI+Ci0JCQkgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5wZXJzcGVjdGl2ZSIvPgotCQkJICAgIDwvd2l0aD4KLSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4gICAgICAgICAKLSAgICAgICAgPC9jb21tYW5kPgotICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZCIKLSAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9uZXdkdGRfd2l6LmdpZiIKLSAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wudWkubmV3RFRERmlsZSIKLSAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgIHRvb2x0aXA9Ik5ldyBYTUwgRmlsZSI+Ci0gICAgICAgICAgICAgPHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgIG5hbWU9Im5ld1dpemFyZElkIgotICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZC5OZXdEVERXaXphcmQiPgotICAgICAgICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucGVyc3BlY3RpdmUiLz4KLQkJCSAgICA8L3dpdGg+Ci0gICAgICAgICAgIDwvdmlzaWJsZVdoZW4+ICAgICAgICAgCi0gICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQiCi0gICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvWFNERmlsZS5naWYiCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLm5ld1hTREZpbGUiCi0gICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICB0b29sdGlwPSJOZXcgWE1MIFNjaGVtYSBGaWxlIj4KLSAgICAgICAgICAgICA8cGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgbmFtZT0ibmV3V2l6YXJkSWQiCi0gICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYU0RXaXphcmQiPgotICAgICAgICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVXb3JrYmVuY2hXaW5kb3cuYWN0aXZlUGVyc3BlY3RpdmUiPgotCQkJICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkucGVyc3BlY3RpdmUiLz4KLQkJCSAgICA8L3dpdGg+Ci0gICAgICAgICAgIDwvdmlzaWJsZVdoZW4+ICAgICAgICAgCi0gICAgICAgIDwvY29tbWFuZD4gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZCIKLSAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC94c2x0X2ZpbGUuZ2lmIgotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5uZXdYU0xGaWxlIgotICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgdG9vbHRpcD0iTmV3IFhTTCBGaWxlIj4KLSAgICAgICAgICAgICA8cGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgbmFtZT0ibmV3V2l6YXJkSWQiCi0gICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdTdHlsZXNoZWV0V2l6YXJkIj4KLSAgICAgICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlV29ya2JlbmNoV2luZG93LmFjdGl2ZVBlcnNwZWN0aXZlIj4KLQkJCSAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnBlcnNwZWN0aXZlIi8+Ci0JCQkgICAgPC93aXRoPgotICAgICAgICAgICA8L3Zpc2libGVXaGVuPiAgICAgICAgIAotICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgIG5hbWU9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICA8L3Rvb2xiYXI+IAotICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0MWJhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMjEzODQ5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsgLy8gaW1wb3J0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnRleHQuSVhTTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhTTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWFNMQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmVkaXRvci5YU0xIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yWFNMOwotCi0vKioKLSAqIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTCBpbXBsZW1lbnRzIGNvbnRlbnQgYXNzaXN0YW5jZSBmb3IKLSAqIGF0dHJpYnV0ZXMgYW5kIG90aGVyIFhQYXRoIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS4KLSAqIAotICogQGF1dGhvciBkY2FydmVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTCBleHRlbmRzCi0JCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yWFNMOwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotCi0JLyoqCi0JICogQ29uZmlndXJhdGlvbiBmb3IgWFNMIENvbnRlbnQgVHlwZXMKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNMKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvY2Vzc29ycyBmb3IgdGhlIGN1cnJlbnQgY29udGVudCB0eXBlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKAotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycyA9IG51bGw7Ci0KLQkJaWYgKChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTikKLQkJCQl8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkKLQkJCQl8fCAocGFydGl0aW9uVHlwZSA9PSBJWFNMUGFydGl0aW9ucy5YU0xfWFBBVEgpKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10geyBuZXcgWFNMQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIH07Ci0JCX0gZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT04pIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSB7IG5ldyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB9OwotCQl9Ci0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRIeXBlcmxpbmtEZXRlY3RvcnMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUh5cGVybGlua0RldGVjdG9yW10gZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgPT0gbnVsbAotCQkJCXx8ICFmUHJlZmVyZW5jZVN0b3JlCi0JCQkJCQkuZ2V0Qm9vbGVhbihBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9IWVBFUkxJTktTX0VOQUJMRUQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlIeXBlcmxpbmtEZXRlY3RvcltdIHN1cGVyRGV0ZWN0b3JzID0gc3VwZXIKLQkJCQkuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKHNvdXJjZVZpZXdlcik7Ci0JCUlIeXBlcmxpbmtEZXRlY3RvcltdIGFsbERldGVjdG9ycyA9IG5ldyBJSHlwZXJsaW5rRGV0ZWN0b3Jbc3VwZXJEZXRlY3RvcnMubGVuZ3RoICsgMV07Ci0JCWFsbERldGVjdG9yc1swXSA9IG5ldyBYU0xIeXBlcmxpbmtEZXRlY3RvcigpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVyRGV0ZWN0b3JzLCAwLCBhbGxEZXRlY3RvcnMsIDEsCi0JCQkJc3VwZXJEZXRlY3RvcnMubGVuZ3RoKTsKLQkJcmV0dXJuIGFsbERldGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCNnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCVN0cmluZ1tdIHhzbFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhTTAotCQkJCQkuZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW3hzbFR5cGVzLmxlbmd0aCArIDJdOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXNbMF0gPSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT047Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1sxXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHhzbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0gMiwKLQkJCQkJeHNsVHlwZXMubGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKAotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLQkJCi0JCWlmICgocGFydGl0aW9uVHlwZSA9PSBJWFNMUGFydGl0aW9ucy5YU0xfWFBBVEgpKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXSB7IGdldExpbmVTdHlsZVByb3ZpZGVyRm9yWFNMKCkgfTsKLQkJfSBlbHNlIGlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkKLQkJCQl8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEpCi0JCQkJfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQpCi0JCQkJfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OKQotCQkJCXx8IChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9QSSkpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltdIHsgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKSB9OwotCQl9Ci0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9yWFNMKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9yWFNMID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvclhTTCA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvclhTTCgpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JYU0w7Ci0JfQotCQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yWE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvclhNTDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1hTTFVJQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvWFNMVUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2NjU0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvWFNMVUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWw7Ci0KLXB1YmxpYyBjbGFzcyBYU0xVSUNvbnN0YW50cwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0NPTlRFWFRfWFNMX05FVyA9ICJ4c2xfbmV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIk5FV19GSUxFX1RFTVBMQVRFX05BTUUiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL1hTTFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvWFNMVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2MzNiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvWFNMVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuU2NvcGVkUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgWFNMVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4c2wgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCQotICAgIHByaXZhdGUgU2NvcGVkUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZTsKLSAgICAKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeG1sIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JCi0JLyoqCi0JICogVGhlIHBsdWdpbiBpZCBmb3IgdGhpcyBwbHVnaW4uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgWFNMVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFhTTFVJUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNMVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBlKQotCXsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgMCwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coQ29yZUV4Y2VwdGlvbiBlKQotCXsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIHhzbCB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4c2wgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpCi0JewotCQlpZiAoZlRlbXBsYXRlU3RvcmUgPT0gbnVsbCkKLQkJewotCQkJZlRlbXBsYXRlU3RvcmUgPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZShnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgIm9yZy5lY2xpcHNlLndzdC54c2wudWkuY3VzdG9tX3RlbXBsYXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl0cnkKLQkJCXsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlsb2coZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIHhzbCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeHNsIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkKLQl7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKQotCQl7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKCJ4c2xfbmV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld0RUREZpbGVXaXphcmREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3RFRERmlsZVdpemFyZERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YTJkNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3RFRERmlsZVdpemFyZERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBOZXdEVERGaWxlV2l6YXJkRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLXsKLQlwcml2YXRlIE5ld1dpemFyZEFjdGlvbiBvcGVuQWN0aW9uOwotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotCXsKLQkJdGhpcy5vcGVuQWN0aW9uID0gbmV3IE5ld1dpemFyZEFjdGlvbigib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotCXsKLQkJb3BlbkFjdGlvbi5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJb3BlbkFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLQl7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXU0RMRmlsZVdpemFyZERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXU0RMRmlsZVdpemFyZERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOGRhNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V1NETEZpbGVXaXphcmREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgTmV3V1NETEZpbGVXaXphcmREZWxlZ2F0ZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgTmV3V2l6YXJkQWN0aW9uIG9wZW5BY3Rpb247Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0JewotCQl0aGlzLm9wZW5BY3Rpb24gPSBuZXcgTmV3V2l6YXJkQWN0aW9uKCJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLQl7Ci0JCW9wZW5BY3Rpb24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCW9wZW5BY3Rpb24ucnVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2l6YXJkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MzJkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld1dpemFyZEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIID0gNTAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDUwMDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JCi0JcHVibGljIE5ld1dpemFyZEFjdGlvbihTdHJpbmcgaWQpCi0JewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCUlXaXphcmREZXNjcmlwdG9yIGRlc2MgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldE5ld1dpemFyZFJlZ2lzdHJ5KCkuZmluZFdpemFyZChpZCk7Ci0JCWlmIChkZXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeQotCQl7Ci0JCQlTaGVsbCBzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJCUlXb3JrYmVuY2hXaXphcmQgd2l6YXJkID0gZGVzYy5jcmVhdGVXaXphcmQoKTsKLQotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IG51bGw7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQl7Ci0JCQkJc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXNzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQkJfQotCQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc3NlbCk7Ci0KLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZShNYXRoLm1heChTSVpJTkdfV0laQVJEX1dJRFRILCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksIFNJWklOR19XSVpBUkRfSEVJR0hUKTsKLQkJCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLk5FV19XSVpBUkQpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlYU0xVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdYTUxGaWxlV2l6YXJkRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1hNTEZpbGVXaXphcmREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTIzMmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1hNTEZpbGVXaXphcmREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgTmV3WE1MRmlsZVdpemFyZERlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi17Ci0JcHJpdmF0ZSBOZXdXaXphcmRBY3Rpb24gb3BlbkFjdGlvbjsKLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLQl7Ci0JCXRoaXMub3BlbkFjdGlvbiA9IG5ldyBOZXdXaXphcmRBY3Rpb24oIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxXaXphcmQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0JewotCQlvcGVuQWN0aW9uLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlvcGVuQWN0aW9uLnJ1bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1hTREZpbGVXaXphcmREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3WFNERmlsZVdpemFyZERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjFmZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3WFNERmlsZVdpemFyZERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBOZXdYU0RGaWxlV2l6YXJkRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLXsKLQlwcml2YXRlIE5ld1dpemFyZEFjdGlvbiBvcGVuQWN0aW9uOwotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotCXsKLQkJdGhpcy5vcGVuQWN0aW9uID0gbmV3IE5ld1dpemFyZEFjdGlvbigib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTRFdpemFyZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLQl7Ci0JCW9wZW5BY3Rpb24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCW9wZW5BY3Rpb24ucnVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3WFNMRmlsZVdpemFyZERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdYU0xGaWxlV2l6YXJkRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0Y2EzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdYU0xGaWxlV2l6YXJkRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIE5ld1hTTEZpbGVXaXphcmREZWxlZ2F0ZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgTmV3V2l6YXJkQWN0aW9uIG9wZW5BY3Rpb247Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0JewotCQl0aGlzLm9wZW5BY3Rpb24gPSBuZXcgTmV3V2l6YXJkQWN0aW9uKCJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHMuTmV3U3R5bGVzaGVldFdpemFyZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLQl7Ci0JCW9wZW5BY3Rpb24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCW9wZW5BY3Rpb24ucnVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZGY5NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVE9ETzogQWRkIEphdmFkb2MKLSAqIEBhdXRob3IgZGNhcnZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YWRvYwotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWFNMQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWFNMQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTgxY2M2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAyMTM4NDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIzMDk1OCAtIHJlZmFjdG9yZWQgdG8gZml4IGJ1ZyB3aXRoIGdldHRpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBET00gRG9jdW1lbnQgZm9yIHRoZSBjdXJyZW50IGVkaXRvcgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC5jb3JlLmludGVybmFsLnBhcnNlci5YUGF0aFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudXRpbC5YU0xUWFBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhQYXRoVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuWFNMQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuWFNMQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwudXRpbC5TdHJ1Y3R1cmVkRG9jdW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuWFNMVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC51dGlsLlhTTFBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudXRpbC5YU0xQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBUaGUgWFNMIENvbnRlbnQgQXNzaXN0IFByb2Nlc3NvciBwcm92aWRlcyBjb250ZW50IGFzc2lzdGFuY2UgZm9yIHZhcmlvdXMKLSAqIGF0dHJpYnV0ZXMgdmFsdWVzIHdpdGhpbiB0aGUgWFNMIEVkaXRvci4gVGhpcyBpbmNsdWRlcyBzdXBwb3J0IGZvciB4cGF0aHMgb24KLSAqIHNlbGVjdCBzdGF0ZW1lbnRzIGFzIHdlbGwgYXMgb24gdGVzdCBhbmQgbWF0Y2ggYXR0cmlidXRlcy4KLSAqIAotICogQGF1dGhvciBEYXZpZCBDYXJ2ZXIKLSAqIAotICoKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWFNMQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIFhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLQkJaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRUxFQ1QgPSAic2VsZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RFU1QgPSAidGVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVRDSCA9ICJtYXRjaCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBSZXRyaWV2ZSBhbGwgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgc3R5bGVzaGVldC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhfR0xPQkFMX1ZBUklBQkxFUyA9ICIveHNsOnN0eWxlc2hlZXQveHNsOnZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0cmlldmUgYWxsIGdsb2JhbCBwYXJhbWV0ZXJzIGluIHRoZSBzdHlsZXNoZWV0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYUEFUSF9HTE9CQUxfUEFSQU1TID0gIi94c2w6c3R5bGVzaGVldC94c2w6cGFyYW0iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMaW1pdCBzZWxlY3Rpb24gb2YgdmFyaWFibGVzIHRvIHRob3NlIHRoYXQgYXJlIGluIHRoZSBsb2NhbCBzY29wZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBBVEhfTE9DQUxfVkFSSUFCTEVTID0gImFuY2VzdG9yOjp4c2w6dGVtcGxhdGUvZGVzY2VuZGFudDo6eHNsOnZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTGltaXQgc2VsZWN0aW9uIG9mIHBhcmFtcyB0byB0aG9zZSB0aGF0IGFyZSBpbiB0aGUgbG9jYWwgc2NvcGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQQVRIX0xPQ0FMX1BBUkFNUyA9ICJhbmNlc3Rvcjo6eHNsOnRlbXBsYXRlL2Rlc2NlbmRhbnQ6OnhzbDpwYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgWFBhdGhUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBmVGVtcGxhdGVDb250ZXh0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBYUEFUSF9MT0NLID0gbmV3IGJ5dGVbMF07Ci0KLQkvKioKLQkgKiBUaGUgWFNMIENvbnRlbnQgQXNzaXN0IFByb2Nlc3NvciBoYW5kbGVzIFhTTCBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IGZvcgotCSAqIGNvbnRlbnQgYXNzaXN0YW5jZS4gSXQgbGV2ZXJhZ2VzIHNldmVyYWwgWFBhdGggc2VsZWN0aW9uIHZhcmlhYmxlcyB0bwotCSAqIGhlbHAgd2l0aCB0aGUgc2VsZWN0aW9uIG9mIGVsZW1lbnRzIGFuZCB0ZW1wbGF0ZSBuYW1lcy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgWFNMQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogVE9ETzogQWRkIEphdmFkb2MKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciMKLQkgKiAJY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlmVGVtcGxhdGVDb250ZXh0cy5jbGVhcigpOwotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JfQotCQotCi0JLyoqCi0JICogQWRkcyBBdHRyaWJ1dGUgcHJvcG9zYWxzIGJhc2VkIG9uIHRoZSBlbGVtZW50IGFuZCB0aGUgYXR0cmlidXRlIHdoZXJlIHRoZQotCSAqIGNvbnRlbnQgcHJvcG9zYWwgd2FzIGluc3RhbnRpYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiAJCUNvbnRlbnQgQXNzaXN0IFJlcXVlc3QgdGhhdCBpbml0aWF0ZWQgdGhlIHByb3Bvc2FsIHJlcXVlc3QKLQkgKiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0KLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBnZXRBdHRyaWJ1dGVOYW1lKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJRWxlbWVudCByb290RWxlbWVudCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgewotCQkJaW50IG9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgMTsKLQotCQkJYWRkQXR0cmlidXRlVmFsdWVPZlByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE5hbWVzcGFjZVVSSSgpLCByb290RWxlbWVudCwgb2Zmc2V0KTsKLQotCQkJaWYgKFhTTENvcmUuaXNYU0xOYW1lc3BhY2UoKElET01Ob2RlKWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKSkpIHsKLQkJCQlhZGRTZWxlY3RBbmRUZXN0UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBhdHRyaWJ1dGVOYW1lLCByb290RWxlbWVudCwgb2Zmc2V0KTsKLQkJCQlhZGRNYXRjaFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgYXR0cmlidXRlTmFtZSwJb2Zmc2V0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRNYXRjaFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCBvZmZzZXQpIHsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEFUVFJfTUFUQ0gpKSB7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aC5BWElTLCBvZmZzZXQpOwotCQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWFBhdGguWFBBVEgsIG9mZnNldCk7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aC5DVVNUT00sIG9mZnNldCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU2VsZWN0QW5kVGVzdFByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgRWxlbWVudCByb290RWxlbWVudCwgaW50IG9mZnNldCkgewotCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoQVRUUl9TRUxFQ1QpIHx8IGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEFUVFJfVEVTVCkpIHsKLQkJCWFkZEdsb2JhbFByb3Bvc2Fscyhyb290RWxlbWVudCwgY29udGVudEFzc2lzdFJlcXVlc3QsIG9mZnNldCk7Ci0JCQlhZGRMb2NhbFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvZmZzZXQpOwotCQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWFBhdGguQVhJUywgb2Zmc2V0KTsKLQkJCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hQYXRoLlhQQVRILCBvZmZzZXQpOwotCQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWFBhdGguQ1VTVE9NLCBvZmZzZXQpOwotCQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWFBhdGguT1BFUkFUT1IsIG9mZnNldCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVPZlByb3Bvc2FscygKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgbmFtZXNwYWNlLCBFbGVtZW50IHJvb3RFbGVtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmNvbnRhaW5zKCJ7IikpIHsKLQkJCWFkZEdsb2JhbFByb3Bvc2Fscyhyb290RWxlbWVudCwgY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQkJCWFkZExvY2FsUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKSwgY29udGVudEFzc2lzdFJlcXVlc3QsCi0JCQkJCSAgICAgICAgICBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aC5BWElTLCBvZmZzZXQpOwotCQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWFBhdGguWFBBVEgsIG9mZnNldCk7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aC5DVVNUT00sIG9mZnNldCk7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYUGF0aC5PUEVSQVRPUiwgb2Zmc2V0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMb2NhbFByb3Bvc2FscyhOb2RlIHhwYXRobm9kZSwKLQkJCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgb2Zmc2V0KSB7Ci0JCWFkZFZhcmlhYmxlc1Byb3Bvc2FscyhYUEFUSF9MT0NBTF9WQVJJQUJMRVMsIHhwYXRobm9kZSwKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCwgb2Zmc2V0KTsKLQkJYWRkVmFyaWFibGVzUHJvcG9zYWxzKFhQQVRIX0xPQ0FMX1BBUkFNUywgeHBhdGhub2RlLAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRHbG9iYWxQcm9wb3NhbHMoTm9kZSB4cGF0aG5vZGUsCi0JCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IG9mZnNldCkgewotCQlhZGRWYXJpYWJsZXNQcm9wb3NhbHMoWFBBVEhfR0xPQkFMX1ZBUklBQkxFUywgeHBhdGhub2RlLAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvZmZzZXQpOwotCQlhZGRWYXJpYWJsZXNQcm9wb3NhbHMoWFBBVEhfR0xPQkFMX1BBUkFNUywgeHBhdGhub2RlLAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgUGFyYW1ldGVyIGFuZCBWYXJpYWJsZXMgYXMgcHJvcG9zYWxzLiBUaGlzCi0JICogaW5mb3JtYXRpb24gaXMgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIFhQYXRoIHN0YXRlbWVudCB0aGF0IGlzIHNlbnQgdG8gaXQKLQkgKiBhbmQgdGhlIGlucHV0IE5vZGUgcGFzc2VkLiBJdCB1c2VzIGEgY3VzdG9tIGNvbXBvc2VyIHRvIFhTTCBWYXJpYWJsZQotCSAqIHByb3Bvc2FsLgotCSAqIAotCSAqIEBwYXJhbSB4cGF0aAotCSAqIEBwYXJhbSB4cGF0aG5vZGUKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlc1Byb3Bvc2FscyhTdHJpbmcgeHBhdGgsIE5vZGUgeHBhdGhub2RlLAotCQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBvZmZzZXQpIHsKLQkJc3luY2hyb25pemVkIChYUEFUSF9MT0NLKSB7Ci0JCQl0cnkgewotCQkJCU5vZGVMaXN0IG5vZGVzID0gWFNMVFhQYXRoSGVscGVyLnNlbGVjdE5vZGVMaXN0KHhwYXRobm9kZSwgeHBhdGgpOwotCQkJCWludCBzdGFydExlbmd0aCA9IGdldEN1cnNvclBvc2l0aW9uKCkgLSBvZmZzZXQ7Ci0KLQkJCQlpZiAoaGFzTm9kZXMobm9kZXMpKSB7Ci0JCQkJCWZvciAoaW50IG5vZGVjbnQgPSAwOyBub2RlY250IDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IG5vZGVjbnQrKykgewotCQkJCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShub2RlY250KTsKLQkJCQkJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSAiJCIgKyBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQkJCXZhcmlhYmxlTmFtZSwgb2Zmc2V0LCAwLCBzdGFydExlbmd0aCArIHZhcmlhYmxlTmFtZS5sZW5ndGgoKSwKLQkJCQkJCQkJWFNMUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYU0xQbHVnaW5JbWFnZXMuSU1HX1ZBUklBQkxFUyksCi0JCQkJCQkJCXZhcmlhYmxlTmFtZSwgbnVsbCwgbnVsbCwgMCk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4KSB7Ci0JCQkJWFNMVUlQbHVnaW4ubG9nKGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgTm9kZUxpc3QgaGFzIGRhdGEKLQkgKiBAcGFyYW0gbm9kZXMgQSBOb2RlTGlzdCBvYmplY3QKLQkgKiBAcmV0dXJuIFRydWUgaWYgaGFzIGRhdGEsIGZhbHNlIGlmIGVtcHR5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc05vZGVzKE5vZGVMaXN0IG5vZGVzKSB7Ci0JCXJldHVybiBub2RlcyAhPSBudWxsICYmIG5vZGVzLmdldExlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIFRleHQgVmlld2VyCi0JICogQHJldHVybiBBbiBpbnQgdmFsdWUgY29udGFpbmluZyB0aGUgY3Vyc29yIHBvc2l0aW9uCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIFhQYXRoIHJlbGF0ZWQgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwKLQkJCVN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIGFscmVhZHkgYWRkaW5nIHRlbXBsYXRlIHByb3Bvc2FscyBmb3IgYSBjZXJ0YWluIGNvbnRleHQgdHlwZSwgZG8KLQkJLy8gbm90IGFkZCBhZ2FpbgotCQlpZiAoIWZUZW1wbGF0ZUNvbnRleHRzLmNvbnRhaW5zKGNvbnRleHQpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5hZGQoY29udGV4dCk7Ci0JCQlib29sZWFuIHVzZVByb3Bvc2FsTGlzdCA9ICFjb250ZW50QXNzaXN0UmVxdWVzdC5zaG91bGRTZXBhcmF0ZSgpOwotCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldENvbnRleHRUeXBlKGNvbnRleHQpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKQotCQkJCQkJLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGZUZXh0Vmlld2VyLCBzdGFydE9mZnNldCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJaWYgKHVzZVByb3Bvc2FsTGlzdCkgewotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWxzW2ldKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZE1hY3JvKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFhQYXRoVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZUZW1wbGF0ZVByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVQcm9jZXNzb3IgPSBuZXcgWFBhdGhUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGF0dHJpYnV0ZSBuYW1lIHRoYXQgdGhlIGNvbnRlbnQgYXNzaXN0IHdhcyB0cmlnZ2VyZWQgb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gKChJRE9NTm9kZSljb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvcGVuUmVnaW9ucyA9IG9wZW4uZ2V0UmVnaW9ucygpOwotCQlpbnQgaSA9IG9wZW5SZWdpb25zLmluZGV4T2YoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkpOwotCQlpZiAoaSA+PSAwKSB7Ci0KLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKGkgPj0gMCkgewotCQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCQlpZiAobmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBuYW1lUmVnaW9uLmdldFRleHQoKTsKLQkJCXJldHVybiBvcGVuLmdldFRleHQobmFtZVJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBNYXRjaCBTdHJpbmcuICBUaGlzIGlzIHR5cGljYWxseSB0aGUgc3RyaW5nLWJlZm9yZSB0aGUgY3VycmVudAotCSAqIG9mZnNldCBwb3NpdGlvbi4gICBGb3IgYSBzdGFuZGFyZCBYTUwgUmVnaW9uIHRoaXMgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZQotCSAqIGJlZ2lubmluZyBvZiB0aGUgcmVnaW9uIChpLmUuIGVsZW1lbnQsIGF0dHJpYnV0ZSwgYXR0cmlidXRlIHZhbHVlLCBldGMuCi0JICogRm9yIFhTTCwgYW4gYWRkaXRpb25hbCBjaGVjayBoYXMgdG8gYmUgbWFkZSB0byBkZXRlcm1pbmUgaWYgd2UgYXJlIHBhcnNpbmcKLQkgKiB3aXRoaW4gYW4gWFBhdGggcmVnaW9uIGFuZCB3aGVyZSB3ZSBhcmUgaW4gdGhlIFhQYXRoIHJlZ2lvbiwgYXMgZGlmZmVyZW50Ci0JICogY29udGVudCBhc3Npc3RhbmNlIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSBkZXBlbmRpbmcgb24gd2hlcmUgd2UgYXJlIGF0LiAgVGhpcwotCSAqIHByaW1hcmlseSBhZmZlY3RzIFRFU1QsIGFuZCBTRUxFQ1QgYXR0cmlidXRlcy4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGFSZWdpb24KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWF0Y2hTdHJpbmcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIGVtcHR5U3RyaW5nID0gIiI7Ci0KLQkJaWYgKGlzTWF0Y2hTdHJpbmdFbXB0eShwYXJlbnQsIGFSZWdpb24sIG9mZnNldCkpIHsKLQkJCXJldHVybiBlbXB0eVN0cmluZzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlJRE9NTm9kZSBjdXJyZW50Tm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdChzdXBlci5mVGV4dFZpZXdlciwgb2Zmc2V0KTsKLQkJCi0JCUlET01BdHRyIGF0dHJpYnV0ZU5vZGUgPSBpc1hQYXRoUmVnaW9uKGN1cnJlbnROb2RlLCBhUmVnaW9uLCBvZmZzZXQpOwotCQlpZiAoYXR0cmlidXRlTm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdGVtcCA9IGV4dHJhY3RYUGF0aE1hdGNoU3RyaW5nKGF0dHJpYnV0ZU5vZGUsIGFSZWdpb24sIG9mZnNldCk7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCQkKLQkJCQkKLQkJaWYgKGhhc1hNTE1hdGNoU3RyaW5nKHBhcmVudCwgYVJlZ2lvbiwgb2Zmc2V0KSkgewotCQkJcmV0dXJuIGV4dHJhY3RYTUxNYXRjaFN0cmluZyhwYXJlbnQsIGFSZWdpb24sIG9mZnNldCk7Ci0JCX0KLQkJLy8gVGhpcyBpcyBoZXJlIGZvciBzYWZ0ZXkgcmVhc29ucy4KLQkJcmV0dXJuIGVtcHR5U3RyaW5nOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RYUGF0aE1hdGNoU3RyaW5nKElET01BdHRyIG5vZGUsIElUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJaWYgKG5vZGUuZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKQlyZXR1cm4gIiI7Ci0JCQotCQlpbnQgbm9kZU9mZnNldCA9IG5vZGUuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQlpbnQgY29sdW1uID0gb2Zmc2V0IC0gbm9kZS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCVhQYXRoUGFyc2VyIHBhcnNlciA9IG5ldyBYUGF0aFBhcnNlcihub2RlLmdldFZhbHVlKCkpOwotCQlpbnQgdG9rZW5TdGFydCA9IHBhcnNlci5nZXRUb2tlblN0YXJ0T2Zmc2V0KDEsIGNvbHVtbik7Ci0JCQotCQlpZiAodG9rZW5TdGFydCA9PSBjb2x1bW4pIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQkKLQkJcmV0dXJuIG5vZGUuZ2V0VmFsdWUoKS5zdWJzdHJpbmcodG9rZW5TdGFydCAtIDEsIGNvbHVtbiAtIDEpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURPTUF0dHIgaXNYUGF0aFJlZ2lvbihJRE9NTm9kZSBjdXJyZW50Tm9kZSwgSVRleHRSZWdpb24gYVJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlpZiAoWFNMQ29yZS5pc1hTTE5hbWVzcGFjZShjdXJyZW50Tm9kZSkpIHsKLQkJCXJldHVybiBnZXRYUGF0aE5vZGUoY3VycmVudE5vZGUsIGFSZWdpb24pOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBJRE9NQXR0ciBnZXRYUGF0aE5vZGUoTm9kZSBub2RlLCBJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCWlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkgewotCQkJaWYgKGhhc0F0dHJpYnV0ZUF0VGV4dFJlZ2lvbihBVFRSX1NFTEVDVCwgbm9kZS5nZXRBdHRyaWJ1dGVzKCksIGFSZWdpb24pKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlQXRUZXh0UmVnaW9uKEFUVFJfU0VMRUNULCBub2RlLmdldEF0dHJpYnV0ZXMoKSwgYVJlZ2lvbik7Ci0JCQl9Ci0JCQkKLQkJCWlmIChoYXNBdHRyaWJ1dGVBdFRleHRSZWdpb24oQVRUUl9URVNULCBub2RlLmdldEF0dHJpYnV0ZXMoKSwgYVJlZ2lvbikpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVBdFRleHRSZWdpb24oQVRUUl9URVNULCBub2RlLmdldEF0dHJpYnV0ZXMoKSwgYVJlZ2lvbik7Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQXR0cmlidXRlQXRUZXh0UmVnaW9uKFN0cmluZyBhdHRyTmFtZSwgTmFtZWROb2RlTWFwIG5vZGVNYXAsIElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJSURPTUF0dHIgYXR0ck5vZGUgPSAoSURPTUF0dHIpIG5vZGVNYXAuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJcmV0dXJuIGF0dHJOb2RlICE9IG51bGwgJiYgYXR0ck5vZGUuZ2V0VmFsdWVSZWdpb24oKS5nZXRTdGFydCgpID09IGFSZWdpb24uZ2V0U3RhcnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElET01BdHRyIGdldEF0dHJpYnV0ZUF0VGV4dFJlZ2lvbihTdHJpbmcgYXR0ck5hbWUsIE5hbWVkTm9kZU1hcCBub2RlTWFwLCBJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCUlET01BdHRyIG5vZGUgPSAoSURPTUF0dHIpIG5vZGVNYXAuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldFZhbHVlUmVnaW9uKCkuZ2V0U3RhcnQoKSA9PSBhUmVnaW9uLmdldFN0YXJ0KCkpIHsKLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBBbiBYTUwgTWF0Y2ggc3RyaW5nIGlzIGV4dHJhY3RlZCBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0JICogcmVnaW9uIHRvIHRoZSBjdXJyZW50IG9mZnNldC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGFSZWdpb24KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFhNTE1hdGNoU3RyaW5nKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LAotCQkJSVRleHRSZWdpb24gYVJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gcGFyZW50LmdldFRleHQoYVJlZ2lvbikuc3Vic3RyaW5nKDAsIG9mZnNldCAtIHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzWE1MTWF0Y2hTdHJpbmcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsCi0JCQlJVGV4dFJlZ2lvbiBhUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiByZWdpb25IYXNEYXRhKHBhcmVudCwgYVJlZ2lvbikgJiYgaXNPZmZzZXRBZnRlclN0YXJ0KHBhcmVudCwgYVJlZ2lvbiwgb2Zmc2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09mZnNldEFmdGVyU3RhcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsCi0JCQlJVGV4dFJlZ2lvbiBhUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikgPCBvZmZzZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVnaW9uSGFzRGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwKLQkJCUlUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJcmV0dXJuIHBhcmVudC5nZXRUZXh0KGFSZWdpb24pLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hNTENvbnRlbnRSZWdpb24oU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJcmV0dXJuIHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09mZnNldEFmdGVyRW5kT2Zmc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LAotCQkJSVRleHRSZWdpb24gYVJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gb2Zmc2V0ID4gZ2V0UmVnaW9uRW5kT2Zmc2V0KHBhcmVudCwgYVJlZ2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRSZWdpb25FbmRPZmZzZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsCi0JCQlJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikgKyBhUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hNTFRhZ09wZW4oU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJcmV0dXJuIHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU47Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBdHRyaWJ1dGVFcXVhbHNSZWdpb24oU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJcmV0dXJuIHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaFN0cmluZ0VtcHR5KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiBhUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBpc1JlZ2lvbk51bGwoYVJlZ2lvbikgfHwKLQkJICAgICAgIGlzQ2xvc2VSZWdpb24oYVJlZ2lvbikgfHwKLQkJICAgICAgIGlzQXR0cmlidXRlRXF1YWxzUmVnaW9uKGFSZWdpb24uZ2V0VHlwZSgpKSB8fAotCQkgICAgICAgaXNYTUxUYWdPcGVuKGFSZWdpb24uZ2V0VHlwZSgpKSB8fAotCQkgICAgICAgaXNPZmZzZXRBZnRlckVuZE9mZnNldChwYXJlbnQsIGFSZWdpb24sIG9mZnNldCkgfHwKLQkJICAgICAgIGlzWE1MQ29udGVudFJlZ2lvbihhUmVnaW9uLmdldFR5cGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVnaW9uTnVsbChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXJldHVybiBhUmVnaW9uID09IG51bGw7Ci0JfQkKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKChkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkgJiYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgIT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJLy8gc2V0dXAgdG8gYWRkIGEgbmV3IGF0dHJpYnV0ZSBhdCB0aGUgZG9jdW1lbnRQb3NpdGlvbgotCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQlpZiAoKGFjdHVhbE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAhYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkgewotCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHNldHVwIHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHZhbHVlCi0JCQlpZiAoIW5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA8IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSkgewotCQkJCS8vIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzbid0IGNsb3NlZCBhbmQgdGhlCi0JCQkJLy8gY3Vyc29yIGlzIGluIGZyb250IG9mIHRoZSB2YWx1ZSwgYWRkCi0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRE9NQXR0ciB4cGF0aE5vZGUgPSB0aGlzLmlzWFBhdGhSZWdpb24obm9kZUF0T2Zmc2V0LCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAoeHBhdGhOb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gVGhpcyBuZWVkcyB0byBzZXR1cCB0aGUgY29udGVudCBhc3Npc3RhbmNlIGNvcnJlY3RseS4gSGVyZSBpcyB3aGF0IG5lZWRzIHRvIGhhcHBlbjoKLQkJCQkJLy8gMS4gQWRqdXN0IHRoZSBtYXRjaFN0cmluZyAoVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgZWFybGllcikgCi0JCQkJCS8vIDIuIEdldCB0aGUgY3VycmVudCB0b2tlbnMgb2Zmc2V0IHBvc2l0aW9uLi50aGlzIHdpbGwgYmUgdGhlIHN0YXJ0aW5nIG9mZnNldC4KLQkJCQkJLy8gMy4gR2V0IHRoZSByZXBsYWNlbWVudCBsZW5ndGguLi50aGlzIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRva2VuIG9mZnNldCBhbmQgdGhlIG5leHQgdG9rZW4gb3IgZW5kIG9mIHRoZSBzdHJpbmcKLQkJCQkJWFBhdGhQYXJzZXIgcGFyc2VyID0gbmV3IFhQYXRoUGFyc2VyKHhwYXRoTm9kZS5nZXRWYWx1ZSgpKTsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0geHBhdGhOb2RlLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIHBhcnNlci5nZXRUb2tlblN0YXJ0T2Zmc2V0KDEsIGRvY3VtZW50UG9zaXRpb24gLSB4cGF0aE5vZGUuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpKSAtIDE7Ci0JCQkJCWludCByZXBsYWNlbWVudExlbmd0aCA9IGRvY3VtZW50UG9zaXRpb24gLSBzdGFydE9mZnNldDsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzdGFydE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIG1hdGNoU3RyaW5nKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCX0KLQkJCQkKLQkJCQlhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTkxZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVhQYXRoQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC4xPURlc2NyaXB0aW9uOlxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YU0xEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWFNMRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZWZmNjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YU0xEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYmFzZWQgb24gYSBwYXRjaAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBieSBOaWsgTWF0eXVzaGV2IGluIGJ1ZyAxOTUyNjIuCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5kb3VibGVjbGljazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG91YmxlY2xpY2suWE1MRG91YmxlQ2xpY2tTdHJhdGVneTsKLSAKLQotLyoqCi0gKiBYU0xEb3VibGVDbGlja1N0cmF0ZWd5IGV4dGVuZHMgdGhlIFhNTERvdWJsZWNsaWNrU3RyYXRlZ3kgdG8gdGFrZSBpbnRvCi0gKiBhY2NvdW50IHRob3NlIGFyZWFzIHRoYXQgbWF5IGJlIGludm9sdmVkIGluIFhQYXRoIEV4cHJlc3Npb25zLgotICogCi0gKiAKLSAqIEBhdXRob3IgZGNhcnZlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xEb3VibGVDbGlja1N0cmF0ZWd5IGV4dGVuZHMgWE1MRG91YmxlQ2xpY2tTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyW10gWE1MX0RFTElNSVRFUlMgPSB7ICcgJywgJ1wnJywgJ1wiJywgJ1snLCAnXScsCi0JCQknfCcsICcoJywgJyknLCAneycsICd9JywgJz0nLCAnIScgfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXJbXSBYTUxfUEFSRU5USEVTSVMgPSB7ICdbJywgJ10nLCAnKCcsICcpJywgJ3snLAotCQkJJ30nIH07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0V29yZChTdHJpbmcgc3RyaW5nLCBpbnQgY3Vyc29yKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgd29yZFN0YXJ0ID0gMDsKLQkJaW50IHdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0KLQkJd29yZFN0YXJ0ID0gc3RhcnRPZldvcmQoc3RyaW5nLCBjdXJzb3IsIHdvcmRTdGFydCk7Ci0JCXdvcmRFbmQgPSBlbmRPZldvcmQoc3RyaW5nLCBjdXJzb3IsIHdvcmRFbmQpOwotCQl3b3JkRW5kID0gY2hlY2tYUGF0aEV4cHJlc3Npb24oc3RyaW5nLCB3b3JkRW5kKTsKLQotCQlpZiAoKHdvcmRTdGFydCA9PSB3b3JkRW5kKSAmJiAhaXNRdW90ZWQoc3RyaW5nKSkgewotCQkJd29yZFN0YXJ0ID0gMDsKLQkJCXdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFBvaW50KHdvcmRTdGFydCwgd29yZEVuZCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2hlY2tYUGF0aEV4cHJlc3Npb24oU3RyaW5nIHN0cmluZywgaW50IHdvcmRFbmQpIHsKLQkJaWYgKHdvcmRFbmQgPCBzdHJpbmcubGVuZ3RoKCkgLSAxKSB7Ci0JCQkvLyBjaGVjayBwYXJhbnRoZXNpcwotCQkJaW50W10gZmxhZ3MgPSBuZXcgaW50W1hNTF9QQVJFTlRIRVNJUy5sZW5ndGggLyAyXTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWludCBwb3MgPSB3b3JkRW5kOwotCQkJZG8gewotCQkJCWNoYXIgY3VyID0gc3RyaW5nLmNoYXJBdChwb3MpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgWE1MX1BBUkVOVEhFU0lTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjdXIgPT0gWE1MX1BBUkVOVEhFU0lTW2ldKSB7Ci0JCQkJCQlmbGFnc1tpIC8gMl0gKz0gKGkgJSAyID09IDAgPyAxIDogLTEpOwotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJvb2xlYW4gc3RvcCA9IHRydWU7Ci0JCQkJYm9vbGVhbiB1bmJhbGFuY2VkID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgewotCQkJCQlzdG9wID0gc3RvcCAmJiBmbGFnc1tpXSA9PSAwOwotCQkJCQl1bmJhbGFuY2VkIHw9IGZsYWdzW2ldIDwgMDsKLQkJCQl9Ci0KLQkJCQlpZiAoIXVuYmFsYW5jZWQpIHsKLQkJCQkJcG9zKys7Ci0JCQkJfQotCQkJCWlmIChzdG9wIHwgdW5iYWxhbmNlZCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IHdoaWxlIChwb3MgPCBzdHJpbmcubGVuZ3RoKCkpOwotCQkJCi0JCQlpZiAoZm91bmQpIHsKLQkJCQl3b3JkRW5kID0gTWF0aC5taW4oc3RyaW5nLmxlbmd0aCgpIC0gMSwgcG9zKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd29yZEVuZDsKLQl9Ci0KLQlwcml2YXRlIGludCBlbmRPZldvcmQoU3RyaW5nIHN0cmluZywgaW50IGN1cnNvciwgaW50IHdvcmRFbmQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBYTUxfREVMSU1JVEVSUy5sZW5ndGg7IGkrKykgewotCQkJY2hhciBkZWxpbSA9IFhNTF9ERUxJTUlURVJTW2ldOwotCQkJaW50IGVuZCA9IHN0cmluZy5pbmRleE9mKGRlbGltLCBjdXJzb3IpOwotCQkJd29yZEVuZCA9IE1hdGgubWluKHdvcmRFbmQsIGVuZCA9PSAtMSA/IHN0cmluZy5sZW5ndGgoKSA6IGVuZCk7Ci0JCX0KLQotCQlpZiAod29yZEVuZCA9PSBzdHJpbmcubGVuZ3RoKCkpIHsKLQkJCXdvcmRFbmQgPSBjdXJzb3I7Ci0JCX0KLQkJcmV0dXJuIHdvcmRFbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzdGFydE9mV29yZChTdHJpbmcgc3RyaW5nLCBpbnQgY3Vyc29yLCBpbnQgd29yZFN0YXJ0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgWE1MX0RFTElNSVRFUlMubGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgZGVsaW0gPSBYTUxfREVMSU1JVEVSU1tpXTsKLQkJCXdvcmRTdGFydCA9IE1hdGgubWF4KHdvcmRTdGFydCwgc3RyaW5nLmxhc3RJbmRleE9mKGRlbGltLAotCQkJCQljdXJzb3IgLSAxKSk7Ci0JCX0KLQotCQlpZiAod29yZFN0YXJ0ID09IC0xKSB7Ci0JCQl3b3JkU3RhcnQgPSBjdXJzb3I7Ci0JCX0gZWxzZSB7Ci0JCQl3b3JkU3RhcnQrKzsKLQkJfQotCQlyZXR1cm4gd29yZFN0YXJ0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL2VkaXRvci9Tb3VyY2VGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL1NvdXJjZUZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3N2FiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL1NvdXJjZUZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5YU0xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuWFNMVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluawotewotCXByaXZhdGUgSVJlZ2lvbiBoeXBlckxpbmtSZWdpb247Ci0JcHJpdmF0ZSBJRmlsZSBsaW5rZWRGaWxlOwotCXByaXZhdGUgWFNMTm9kZSBzb3VyY2VBcnRpZmFjdDsKLQotCXB1YmxpYyBTb3VyY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gaHlwZXJMaW5rUmVnaW9uLCBJRmlsZSBsaW5rZWRGaWxlKQotCXsKLQkJdGhpcy5oeXBlckxpbmtSZWdpb24gPSBoeXBlckxpbmtSZWdpb247Ci0JCXRoaXMubGlua2VkRmlsZSA9IGxpbmtlZEZpbGU7Ci0JfQotCi0JcHVibGljIFNvdXJjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiBoeXBlckxpbmtSZWdpb24sIElGaWxlIGxpbmtlZEZpbGUsIFhTTE5vZGUgbm9kZSkKLQl7Ci0JCXRoaXMuaHlwZXJMaW5rUmVnaW9uID0gaHlwZXJMaW5rUmVnaW9uOwotCQl0aGlzLmxpbmtlZEZpbGUgPSBsaW5rZWRGaWxlOwotCQl0aGlzLnNvdXJjZUFydGlmYWN0ID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKQotCXsKLQkJcmV0dXJuIGh5cGVyTGlua1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpCi0JewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpCi0JewotCQlyZXR1cm4gbGlua2VkRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpCi0JewotCQlpZiAobGlua2VkRmlsZSAhPSBudWxsICYmIGxpbmtlZEZpbGUuZXhpc3RzKCkpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBsaW5rZWRGaWxlLCB0cnVlKTsKLQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQlpZiAoc291cmNlQXJ0aWZhY3QgIT0gbnVsbCAmJiB0ZXh0RWRpdG9yICE9IG51bGwpCi0JCQkJewotCQkJCQlJRG9jdW1lbnQgb3BlbmVkRG9jdW1lbnQgPSAoSURvY3VtZW50KWVkaXRvci5nZXRBZGFwdGVyKElEb2N1bWVudC5jbGFzcyk7Ci0JCQkJCWlmIChvcGVuZWREb2N1bWVudCAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlpbnQgbGluZU9mZnNldCA9IG9wZW5lZERvY3VtZW50LmdldExpbmVPZmZzZXQoc291cmNlQXJ0aWZhY3QuZ2V0TGluZU51bWJlcigpKTsKLQkJCQkJCWludCBvZmZzZXQgPSBsaW5lT2Zmc2V0ICsgc291cmNlQXJ0aWZhY3QuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0JCQkJCQkvL3RleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG9mZnNldCwgc291cmNlQXJ0aWZhY3QuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJdGV4dEVkaXRvci5zZXRIaWdobGlnaHRSYW5nZShvZmZzZXQsIHNvdXJjZUFydGlmYWN0LmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0JCQl7Ci0JCQkJWFNMVUlQbHVnaW4ubG9nKHBpZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlYU0xVSVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9lZGl0b3IvWFNMSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9lZGl0b3IvWFNMSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNzcwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvZWRpdG9yL1hTTEh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5pbnRlcm5hbC5tb2RlbC5TdHlsZXNoZWV0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLmludGVybmFsLm1vZGVsLlRlbXBsYXRlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBIGh5cGVybGluayBkZXRlY3RvciBmb3IgWFNMIGZpbGVzLgotICogCi0gKiBUaGUgZGV0ZWN0b3IgbWFrZXMgdXNlIG9mIHRoZSBtb2RlbCBidWlsdCBieSBTU0UgdmFsaWRhdGlvbiAoZm91bmQgaW4gPGNvZGU+WFNMQ29yZTwvY29kZT4pLgotICogCi0gKiBDdXJyZW50bHkgc3VwcG9ydHMgaHlwZXJsaW5raW5nIGZvciBpbmNsdWRlcywgaW1wb3J0cyBvciBjYWxsZWQgdGVtcGxhdGVzLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3IKLXsKLQkvKioKLQkgKiBUcnkgdG8gY3JlYXRlIGh5cGVybGlua3MgZm9yIHZpZXdlciBhbmQgcmVnaW9uCi0JICogCi0JICogQHNlZSBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yCi0JICogQHBhcmFtIHRleHRWaWV3ZXIgCi0JICogQHBhcmFtIHJlZ2lvbiAKLQkgKiBAcGFyYW0gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcyAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIGh5cGVybGlua3MgZm9yIGN1cnJlbnQgcmVnaW9uCi0JICovCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpCi0JewotCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IG51bGw7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiBkZXRlY3RIeXBlcmxpbmtzKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgcmVnaW9uLCBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rID09IG51bGwgPyBudWxsIDogbmV3IElIeXBlcmxpbmtbXXtoeXBlcmxpbmt9OwotCX0KLQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJRG9jdW1lbnQgZG9jdW1lbnQsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpCi0JewotCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IG51bGw7Ci0JCQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgZG9jdW1lbnQgIT0gbnVsbCkKLQkJewotCQkJTm9kZSBjdXJyZW50Tm9kZSA9IGdldEN1cnJlbnROb2RlKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCQlFbGVtZW50IHhzbEVsID0gbnVsbDsKLQkJCUF0dHIgeHNsQXR0ciA9IG51bGw7Ci0JCQlpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJewotCQkJCUF0dHIgYXR0ID0gKEF0dHIpIGN1cnJlbnROb2RlOwotCQkJCWlmIChYU0xDb3JlLlhTTF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhhdHQuZ2V0T3duZXJFbGVtZW50KCkuZ2V0TmFtZXNwYWNlVVJJKCkpKQotCQkJCXsKLQkJCQkJeHNsRWwgPSBhdHQuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJCXhzbEF0dHIgPSBhdHQ7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXsKLQkJCQlFbGVtZW50IGVsID0gKEVsZW1lbnQpY3VycmVudE5vZGU7Ci0JCQkJaWYgKFhTTENvcmUuWFNMX05BTUVTUEFDRV9VUkkuZXF1YWxzKGVsLmdldE5hbWVzcGFjZVVSSSgpKSkKLQkJCQl7Ci0JCQkJCXhzbEVsID0gZWw7Ci0JCQkJCXhzbEF0dHIgPSBnZXRDdXJyZW50QXR0ck5vZGUoZWwsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdHJ5IHRvIGNyZWF0ZSBoeXBlcmxpbmsgZnJvbSBpbmZvcm1hdGlvbiBnYXRoZXJlZAotCQkJaWYgKHhzbEVsICE9IG51bGwgJiYgeHNsQXR0ciAhPSBudWxsKQotCQkJewotCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKHhzbEF0dHIpOwotCQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlRm9yRG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJewotCQkJCQlpZiAoImNhbGwtdGVtcGxhdGUiLmVxdWFscyh4c2xFbC5nZXRMb2NhbE5hbWUoKSkgJiYgIm5hbWUiLmVxdWFscyh4c2xBdHRyLmdldExvY2FsTmFtZSgpKSkKLQkJCQkJewotCQkJCQkJaHlwZXJsaW5rID0gY3JlYXRlQ2FsbFRlbXBsYXRlSHlwZXJMaW5rKGZpbGUseHNsQXR0ci5nZXRWYWx1ZSgpLCBoeXBlcmxpbmtSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCgiaW5jbHVkZSIuZXF1YWxzKHhzbEVsLmdldExvY2FsTmFtZSgpKSB8fCAiaW1wb3J0Ii5lcXVhbHMoeHNsRWwuZ2V0TG9jYWxOYW1lKCkpKQotCQkJCQkJJiYgImhyZWYiLmVxdWFscyh4c2xBdHRyLmdldExvY2FsTmFtZSgpKSkKLQkJCQkJewotCQkJCQkJaHlwZXJsaW5rID0gY3JlYXRlSW5jbHVkZUh5cGVyTGluayhmaWxlLHhzbEF0dHIuZ2V0VmFsdWUoKSwgaHlwZXJsaW5rUmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rID09IG51bGwgPyBudWxsIDogbmV3IElIeXBlcmxpbmtbXXtoeXBlcmxpbmt9OwotCX0KLQkKLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSW5jbHVkZUh5cGVyTGluayhJRmlsZSBjdXJyZW50RmlsZSwgU3RyaW5nIGluY2x1ZGUsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uKQotCXsKLQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBudWxsOwotCQlJRmlsZSBsaW5rZWRGaWxlID0gWFNMQ29yZS5yZXNvbHZlRmlsZShjdXJyZW50RmlsZSwgaW5jbHVkZSk7Ci0JCWlmIChsaW5rZWRGaWxlICE9IG51bGwgJiYgbGlua2VkRmlsZS5leGlzdHMoKSkKLQkJCWh5cGVybGluayA9IG5ldyBTb3VyY2VGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbixsaW5rZWRGaWxlKTsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlQ2FsbFRlbXBsYXRlSHlwZXJMaW5rKElGaWxlIGN1cnJlbnRGaWxlLCBTdHJpbmcgdGVtcGxhdGVOYW1lLCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbikKLQl7Ci0JCUlIeXBlcmxpbmsgaHlwZXJsaW5rID0gbnVsbDsKLQkJU3R5bGVzaGVldE1vZGVsIHNmID0gWFNMQ29yZS5nZXRJbnN0YW5jZSgpLmdldFN0eWxlc2hlZXQoY3VycmVudEZpbGUpOwotCQlpZiAoc2YgIT0gbnVsbCkKLQkJewotCQkJTGlzdDxUZW1wbGF0ZT4gdGVtcGxhdGVzID0gc2YuZ2V0VGVtcGxhdGVzQnlOYW1lKHRlbXBsYXRlTmFtZSk7Ci0JCQlpZiAodGVtcGxhdGVzICE9IG51bGwgJiYgdGVtcGxhdGVzLnNpemUoKSA9PSAxKQotCQkJewotCQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gdGVtcGxhdGVzLmdldCgwKTsKLQkJCQloeXBlcmxpbmsgPSBuZXcgU291cmNlRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sdGVtcGxhdGUuZ2V0U3R5bGVzaGVldCgpLmdldEZpbGUoKSx0ZW1wbGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQlwcml2YXRlIEF0dHIgZ2V0Q3VycmVudEF0dHJOb2RlKE5vZGUgbm9kZSwgaW50IG9mZnNldCkKLQl7Ci0JCWlmICgobm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuY29udGFpbnMob2Zmc2V0KSAmJiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpKQotCQl7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkKLQkJCXsKLQkJCQlJbmRleGVkUmVnaW9uIGF0dFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBhdHRycy5pdGVtKGkpOwotCQkJCWlmIChhdHRSZWdpb24uY29udGFpbnMob2Zmc2V0KSkKLQkJCQl7Ci0JCQkJCXJldHVybiAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlIGdldEN1cnJlbnROb2RlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkKLQl7Ci0JCUluZGV4ZWRSZWdpb24gaW5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJCWlmIChpbm9kZSA9PSBudWxsKQotCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0IC0gMSk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0KLQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkKLQkJewotCQkJcmV0dXJuIChOb2RlKSBpbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKE5vZGUgbm9kZSkKLQl7Ci0JCUlSZWdpb24gaHlwZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChub2RlICE9IG51bGwpCi0JCXsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKQotCQkJewotCQkJCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCQkJSURPTU5vZGUgZG9jTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24oZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpLCBkb2NOb2RlLmdldEVuZE9mZnNldCgpIC0gZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQl7Ci0JCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlcwotCQkJCUlET01BdHRyIGF0dCA9IChJRE9NQXR0cikgbm9kZTsKLQkJCQkvLyBkbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCWludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQkJewotCQkJCQlpbnQgcmVnTGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlTdHJpbmcgYXR0VmFsdWUgPSBhdHQuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChTdHJpbmdVdGlscy5pc1F1b3RlZChhdHRWYWx1ZSkpCi0JCQkJCXsKLQkJCQkJCSsrcmVnT2Zmc2V0OwotCQkJCQkJcmVnTGVuZ3RoID0gcmVnTGVuZ3RoIC0gMjsKLQkJCQkJfQotCQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24ocmVnT2Zmc2V0LCByZWdMZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaHlwZXJSZWdpb247Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZUZvckRvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkKLQl7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCXsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoc01vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCQlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgPyBmaWxlIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9oYW5kbGVycy9PcGVuRGVjbGFyYXRpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvaGFuZGxlcnMvT3BlbkRlY2xhcmF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE3NjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9oYW5kbGVycy9PcGVuRGVjbGFyYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLmVkaXRvci5YU0xIeXBlcmxpbmtEZXRlY3RvcjsKLQotcHVibGljIGNsYXNzIE9wZW5EZWNsYXJhdGlvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsKLQlwcml2YXRlIFhTTEh5cGVybGlua0RldGVjdG9yIGRldGVjdG9yID0gbmV3IFhTTEh5cGVybGlua0RldGVjdG9yKCk7Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLQl7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJZWxzZQotCQl7Ci0JCQlPYmplY3QgbyA9IGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCWlmIChvICE9IG51bGwpCi0JCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgbzsKLQkJfQotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQl7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQl7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlpZiAodGV4dFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJaW50IG9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJaWYgKG9mZnNldCA9PSAtMSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJSVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKG9mZnNldCwgMCk7Ci0JCQkJSUh5cGVybGlua1tdIGxpbmtzID0gZGV0ZWN0b3IuZGV0ZWN0SHlwZXJsaW5rcyhkb2N1bWVudCwgcmVnaW9uLCB0cnVlKTsKLQkJCQlpZiAobGlua3MgIT0gbnVsbCAmJiBsaW5rcy5sZW5ndGggPiAwKQotCQkJCXsKLQkJCQkJSUh5cGVybGluayBsaW5rID0gbGlua3NbMF07Ci0JCQkJCWxpbmsub3BlbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVRleHRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKQotCXsKLQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkKLQkJewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikKLQkJCXsKLQkJCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9YTUxQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9YTUxQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1NTZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvWE1MUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gYnVnIDIxMzg4MyAtIGluaXRpYWwgYXBpIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuUHJvamVjdEV4cGxvcmVyOwotCi0KLS8qKgotICogQGF1dGhvciBkY2FydmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1MUGVyc3BlY3RpdmVGYWN0b3J5IGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBpbml0aWFsIGxheW91dC4gIFRoaXMgaXMgd2hhdCB0aGUgbGF5b3V0IGlzIHJlc2V0IHRvCi0gICAgICogd2hlbiB0aGUgUmVzZXQgUGVyc3BlY3RpdmUgaXMgc2VsZWN0ZWQuICAgSXQgdGFrZXMgYXMgaW5wdXQgYQotICAgICAqIElQYWdlTGF5b3V0IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsYXlvdXQgCi0gICAgICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJLy8gR2V0IHRoZSBFZGl0b3IgQXJlYQotCQlTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0KLQkJdGhpcy5hZGRTaG9ydEN1dFZpZXdzKGxheW91dCk7Ci0JCXRoaXMuYWRkU2hvcnRDdXRQZXJzcGVjdGl2ZShsYXlvdXQpOwotCi0JCWxheW91dC5hZGRBY3Rpb25TZXQoSURlYnVnVUlDb25zdGFudHMuTEFVTkNIX0FDVElPTl9TRVQpOwotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KCJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnhzbEFjdGlvblNldCIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVHVybiBvbiB0aGUgRWRpdG9yIEFyZWEKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOwotCQlsYXlvdXQuc2V0Rml4ZWQoZmFsc2UpOwotCQkKLQkJLy8gQWRkIHRoZSB2YXJpb3VzIHZpZXdzCi0JCUlGb2xkZXJMYXlvdXQgbGVmdCA9Ci0gICAgICAgIGxheW91dC5jcmVhdGVGb2xkZXIoImxlZnQiLCBJUGFnZUxheW91dC5MRUZULCAoZmxvYXQpIDAuMjYsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCWxlZnQuYWRkVmlldyhQcm9qZWN0RXhwbG9yZXIuVklFV19JRCk7Ci0JCQotCQlJRm9sZGVyTGF5b3V0IHJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigicmlnaHQiLCBJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KSAwLjc1LCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQlyaWdodC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX09VVExJTkUpOwotCQkKLQkJLy8gQWRkIE91dGxpbmUgdG8gdGhlIGJvdHRvbS1sZWZ0Ci0JCUlGb2xkZXJMYXlvdXQgYm90dG9tTGVmdCA9IAotCQkJbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tLWxlZnQiLCBJUGFnZUxheW91dC5CT1RUT00sIChmbG9hdCkgMC41MCwgImxlZnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJvdHRvbUxlZnQuYWRkVmlldygib3JnLmVjbGlwc2Uud3N0LnhtbC52aWV3cy5YUGF0aFZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkvL2JvdHRvbUxlZnQuYWRkVmlldygib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJRm9sZGVyTGF5b3V0IGJvdHRvbSA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbSIsIElQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KSAwLjc1LCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQlib3R0b20uYWRkVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQlib3R0b20uYWRkVmlldyhJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKLQkJYm90dG9tLmFkZFZpZXcoSUNvbnNvbGVDb25zdGFudHMuSURfQ09OU09MRV9WSUVXKTsKLQkJYm90dG9tLmFkZFZpZXcoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMuaW50ZXJuYWwudWkuU25pcHBldHNWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuTmV3WE1MV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHMuTmV3U3R5bGVzaGVldFdpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZC5OZXdEVERXaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQkvL2xheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hTRFdpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIpOyAvLyROT04tTkxTLTEkCi0JCS8vbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5mb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkvL2xheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgiYWRkaXRpb25zIik7Ci0JCQotCQlsYXlvdXQuYWRkUGVyc3BlY3RpdmVTaG9ydGN1dCgib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSIpOyAvLyROT04tTkxTLTEkCi0JCQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIFZpZXcgc2hvcnQgY3V0cyB0byB0aGUgWE1MIFBlcnNwZWN0aXZlLiAgVGhlIHNob3J0IGN1dHMgYWRkZWQgYXJlOgotCSAqIFhQYXRoIE5hdmlnYXRvcgotCSAqIFByb2plY3RFeHBsb3JlcgotCSAqIE5hdmlnYXRvcgotCSAqIFByb2JsZW1zIFZpZXcKLQkgKiBDb25zb2xlIFZpZXcgCi0JICogQHBhcmFtIGxheW91dAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTaG9ydEN1dFZpZXdzKElQYWdlTGF5b3V0IGxheW91dCkgewotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dCgib3JnLmVjbGlwc2Uud3N0LnhtbC52aWV3cy5YUGF0aFZpZXciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dCgib3JnLmVjbGlwc2Uud3N0LnhtbC54cGF0aC51aS52aWV3cy5YUGF0aE5hdmlnYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KFByb2plY3RFeHBsb3Jlci5WSUVXX0lEKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0gICAgICAgIGxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX09VVExJTkUpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotICAgICAgICBsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zbmlwcGV0cy5pbnRlcm5hbC51aS5TbmlwcGV0c1ZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkU2hvcnRDdXRQZXJzcGVjdGl2ZShJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0Fic3RyYWN0WFNMUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9BYnN0cmFjdFhTTFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTg2OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0Fic3RyYWN0WFNMUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU2Nyb2xsZWRQYWdlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUuaW50ZXJuYWwuWFNMQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotCi0vKioKLSAqIEF1Z21lbnRzIHRoZSBTU0UgPGNvZGU+QWJzdHJhY3RQcmVmZXJlbmNlUGFnZTwvY29kZT4gd2l0aCBzdXBwb3J0IGZvciBleHBhbmRhYmxlIGNvbXBvc2l0ZXMgKHR3aXN0aWVzKSBhbmQgY29tYm9zLgotICogCi0gKiBAYXV0aG9yIERvdWcgU2F0Y2h3ZWxsCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYU0xQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTRVRUSU5HU19FWFBBTkRFRCA9IGdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKyIuU0VUVElOR1NfRVhQQU5ERUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VUVElOR1NfU0VDVElPTl9OQU1FID0gZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkrIi5TRVRUSU5HU19TRUNUSU9OX05BTUUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIExpc3Q8RXhwYW5kYWJsZUNvbXBvc2l0ZT4gZkV4cGFuZGFibGVzID0gbmV3IEFycmF5TGlzdDxFeHBhbmRhYmxlQ29tcG9zaXRlPigpOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCWNyZWF0ZUNvbW1vbkNvbnRlbnRzKHBhcmVudCk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCQlyZXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhnZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKSk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IGNyZWF0ZUNvbnRlbnRzIGFuZCBtdXN0IGJlIGltcGxlbWVudGVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZUNvbW1vbkNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUd2lzdGllKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgaW50IGNvbHMpCi0JewotCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlID0gbmV3IEV4cGFuZGFibGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5DTElFTlRfSU5ERU5UKTsKLQkJZXhjb21wb3NpdGUuc2V0VGV4dChsYWJlbCk7Ci0JCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJZXhjb21wb3NpdGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKSk7Ci0JCWV4Y29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlLCBjb2xzLCAxKSk7Ci0JCWV4Y29tcG9zaXRlLmFkZEV4cGFuc2lvbkxpc3RlbmVyKG5ldyBFeHBhbnNpb25BZGFwdGVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKEV4cGFuc2lvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJZXhwYW5kZWRTdGF0ZUNoYW5nZWQoKEV4cGFuZGFibGVDb21wb3NpdGUpIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJZkV4cGFuZGFibGVzLmFkZChleGNvbXBvc2l0ZSk7Ci0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoZXhjb21wb3NpdGUpOwotCi0JCUNvbXBvc2l0ZSB0d2lzdGllQ2llbnQgPSBuZXcgQ29tcG9zaXRlKGV4Y29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWV4Y29tcG9zaXRlLnNldENsaWVudCh0d2lzdGllQ2llbnQpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSA1OwotCQl0d2lzdGllQ2llbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5OT05FLCB0cnVlLCBmYWxzZSk7Ci0JCXR3aXN0aWVDaWVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlyZXR1cm4gdHdpc3RpZUNpZW50OwotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBleHBhbmRlZFN0YXRlQ2hhbmdlZChFeHBhbmRhYmxlQ29tcG9zaXRlIGV4cGFuZGFibGUpCi0JewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlID0gZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoZXhwYW5kYWJsZSk7Ci0JCWlmIChwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSAhPSBudWxsKQotCQl7Ci0JCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5yZWZsb3codHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShDb250cm9sIGNvbnRyb2wpCi0JewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlID0gZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoY29udHJvbCk7Ci0JCWlmIChwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSAhPSBudWxsKQotCQl7Ci0JCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5hZGFwdENoaWxkKGNvbnRyb2wpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTY3JvbGxlZFBhZ2VDb250ZW50IGdldFBhcmVudFNjcm9sbGVkQ29tcG9zaXRlKENvbnRyb2wgY29udHJvbCkKLQl7Ci0JCUNvbnRyb2wgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkgJiYgcGFyZW50ICE9IG51bGwpCi0JCXsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkKLQkJewotCQkJcmV0dXJuIChTY3JvbGxlZFBhZ2VDb250ZW50KSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHByZWZLZXkpCi0JewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKTsKLQotCQlMYWJlbCBsYWJlbENvbnRyb2wgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsQ29udHJvbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWxhYmVsQ29udHJvbC5zZXRUZXh0KGxhYmVsKTsKLQkJbGFiZWxDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0JCUNvbWJvIGNvbWJvID0gY3JlYXRlRHJvcERvd25Cb3gocGFyZW50KTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbikKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkV4cGFuZGFibGVzLnNpemUoKTsgaSsrKQotCQl7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGNvbXAgPSAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZkV4cGFuZGFibGVzLmdldChpKTsKLQkJCXNlY3Rpb24ucHV0KFNFVFRJTkdTX0VYUEFOREVEICsgU3RyaW5nLnZhbHVlT2YoaSksIGNvbXAuaXNFeHBhbmRlZCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLQl7Ci0JCXJldHVybiBYU0xVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZXhwYW5zaW9uIHN0YXRlcyBiZWZvcmUgY2FsbGluZyBzdXBlci4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JCXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhnZXREaWFsb2dTZXR0aW5ncygpLmFkZE5ld1NlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKSk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmRXhwYW5kYWJsZXMuc2l6ZSgpOyBpKyspCi0JCXsKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUgZXhjb21wb3NpdGUgPSAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZkV4cGFuZGFibGVzLmdldChpKTsKLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKQotCQkJewotCQkJCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKGkgPT0gMCk7IC8vIG9ubHkgZXhwYW5kIHRoZSBmaXJzdCBub2RlIGJ5IGRlZmF1bHQKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChzZXR0aW5ncy5nZXRCb29sZWFuKFNFVFRJTkdTX0VYUEFOREVEICsgU3RyaW5nLnZhbHVlT2YoaSkpKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkKLQl7Ci0JCXJldHVybiBYU0xDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLQl7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJaWYgKG9rKQotCQkJWFNMQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjdkMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL01haW5QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMjEzODUzIC0gTW92ZWQgbWFpbiBwcmVmZXJlbmNlIHBhZ2Ugb3V0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyB1aSBhbmQgaW50byBYU0wgdWkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWFpblByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLQkvKioKLQkgKiBNYWluUHJlZmVybmNlUGFnZSBpcyB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBYU0wgUHJlZmVyZW5jZSBQYWdlCi0JICovCi0JcHVibGljIE1haW5QcmVmZXJlbmNlUGFnZSgpCi0JewotCQlzdXBlcigpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCS8qKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0JewotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikKLQl7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhhbmNlc3Rvcik7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlhbmNlc3Rvci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChhbmNlc3RvciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLjAiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChhbmNlc3RvcixTV1QuTk9ORSk7Ci0JCS8vIGxhYmVsLnNldFRleHQoIlJlc29sdmUgVVJJJ3MgcmVsYXRpdmUgdG86Iik7Ci0JCS8vCQkKLQkJLy8gQnV0dG9uIHJhZGlvMSA9IG5ldyBCdXR0b24oYW5jZXN0b3IsU1dULlJBRElPKTsKLQkJLy8gcmFkaW8xLnNldFRleHQoIndvcmtpbmcgZGlyZWN0b3J5Iik7Ci0JCS8vCQkKLQkJLy8gQnV0dG9uIHJhZGlvMiA9IG5ldyBCdXR0b24oYW5jZXN0b3IsU1dULlJBRElPKTsKLQkJLy8gcmFkaW8yLnNldFRleHQoInN0eWxlc2hlZXQiKTsKLQkJLy8JCQotCQkvLyBCdXR0b24gcmFkaW8zID0gbmV3IEJ1dHRvbihhbmNlc3RvcixTV1QuUkFESU8pOwotCQkvLyByYWRpbzMuc2V0VGV4dCgiaW5wdXQgZmlsZSIpOwotCQkvLwotCQkvLyBCdXR0b24gcmFkaW80ID0gbmV3IEJ1dHRvbihhbmNlc3RvcixTV1QuUkFESU8pOwotCQkvLyByYWRpbzQuc2V0VGV4dCgic3BlY2lmaWMgbG9jYXRpb24iKTsKLQkJLy8KLQkJLy8gbGFiZWwgPSBuZXcgTGFiZWwoYW5jZXN0b3IsU1dULk5PTkUpOwotCQkvLyBsYWJlbC5zZXRUZXh0KCJEZWZhdWx0IG91dHB1dCBkaXJlY3Rvcnk6Iik7Ci0JCS8vCQkKLQkJLy8gcmFkaW8xID0gbmV3IEJ1dHRvbihhbmNlc3RvcixTV1QuUkFESU8pOwotCQkvLyByYWRpbzEuc2V0VGV4dCgidGVtcCB1c2VyLmRpciIpOwotCQkvLwkJCi0JCS8vIHJhZGlvMiA9IG5ldyBCdXR0b24oYW5jZXN0b3IsU1dULlJBRElPKTsKLQkJLy8gcmFkaW8yLnNldFRleHQoInNhbWUgYXMgd29ya2luZyBkaXJlY3RvcnkiKTsKLQkJLy8JCQotCQkvLyByYWRpbzMgPSBuZXcgQnV0dG9uKGFuY2VzdG9yLFNXVC5SQURJTyk7Ci0JCS8vIHJhZGlvMy5zZXRUZXh0KCJzcGVjaWZpYyBsb2NhdGlvbiIpOwotCi0JCS8vIFRPRE8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscC4uLgotCi0JCWFwcGx5RGlhbG9nRm9udChhbmNlc3Rvcik7Ci0JCXJldHVybiBhbmNlc3RvcjsKLQl9Ci0KLQkvKiogCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhNjJlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRPRE86IEFkZCBKYXZhZG9jCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCS8qKgotCSAqIFRPRE86IEFkZCBKYXZhZG9jCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNWQzNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLlZhbGlkYXRpb25QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIFhTTCB2YWxpZGF0b3IgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgRG91ZyBTYXRjaHdlbGwKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0WFNMUHJlZmVyZW5jZVBhZ2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFUlJPUlMgPSBuZXcgU3RyaW5nW10geyAiRXJyb3IiLCAiV2FybmluZyIsICJJZ25vcmUiIH07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gRVJST1JfVkFMVUVTID0gbmV3IGludFtdIHsgSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8gfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgSW50ZWdlcj4gRVJST1JfTUFQID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLQlwcml2YXRlIFRleHQgbWF4RXJyb3JzVGV4dDsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbWJvPiBjb21ib3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbWJvPigpOwotCi0Jc3RhdGljCi0JewotCQlFUlJPUl9NQVAucHV0KElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIDApOwotCQlFUlJPUl9NQVAucHV0KElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgMSk7Ci0JCUVSUk9SX01BUC5wdXQoSU1hcmtlci5TRVZFUklUWV9JTkZPLCAyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JCS8vIG9ubHkgdXNlZCB3aGVuIHBhZ2UgaXMgc2hvd24gcHJvZ3JhbWF0aWNhbGx5Ci0JCXNldFRpdGxlKCJYU0wgVmFsaWRhdGlvbiIpOwotCQlzZXREZXNjcmlwdGlvbigiQ29uZmlndXJlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbW1vbkNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQ9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJCi0JCWZpbmFsIFNjcm9sbGVkUGFnZUNvbnRlbnQgcGFnZUNvbnRlbnQgPSBuZXcgU2Nyb2xsZWRQYWdlQ29udGVudChwYXJlbnQpOwotCQlwYWdlQ29udGVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFnZUNvbnRlbnQuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJcGFnZUNvbnRlbnQuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQotCQlDb21wb3NpdGUgYm9keSA9IHBhZ2VDb250ZW50LmdldEJvZHkoKTsKLQkJYm9keS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCi0JCWNyZWF0ZUxhYmVsKGJvZHksICJNYXhpbXVtIG51bWJlciBvZiBlcnJvcnMgcmVwb3J0ZWQgcGVyIHN0eWxlc2hlZXQ6Iik7Ci0JCW1heEVycm9yc1RleHQgPSBjcmVhdGVUZXh0RmllbGQoYm9keSk7Ci0JCW1heEVycm9yc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJQ29tcG9zaXRlIHR3aXN0aWU7Ci0JCQotCQl0d2lzdGllID0gY3JlYXRlVHdpc3RpZShib2R5LCJJbXBvcnRzIGFuZCBJbmNsdWRlcyIsMik7CQkKLQkJY3JlYXRlQ29tYm8odHdpc3RpZSwgIlVucmVzb2x2ZWQgaW5jbHVkZS9pbXBvcnQ6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLk1JU1NJTkdfSU5DTFVERSk7Ci0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJDaXJjdWxhciByZWZlcmVuY2VzOiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5DSVJDVUxBUl9SRUYpOwotCi0JCXR3aXN0aWUgPSBjcmVhdGVUd2lzdGllKGJvZHksIk5hbWVkIFRlbXBsYXRlcyIsMik7CQkKLQkJY3JlYXRlQ29tYm8odHdpc3RpZSwgIlRlbXBsYXRlIG5hbWUgY29uZmxpY3RzOiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5URU1QTEFURV9DT05GTElDVCk7Ci0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJEdXBsaWNhdGUgcGFyYW1ldGVydzoiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRFVQTElDQVRFX1BBUkFNRVRFUik7Ci0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJQYXJhbWV0ZXIgd2l0aG91dCBuYW1lIGF0dHJpYnV0ZToiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTkFNRV9BVFRSSUJVVEVfTUlTU0lORyk7Ci0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJQYXJhbWV0ZXIgd2l0aCBlbXB0eSBuYW1lIGF0dHJpYnV0ZToiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTkFNRV9BVFRSSUJVVEVfRU1QVFkpOwotCQkKLQkJdHdpc3RpZSA9IGNyZWF0ZVR3aXN0aWUoYm9keSwiVGVtcGxhdGUgQ2FsbHMiLDIpOwkJCi0JCWNyZWF0ZUNvbWJvKHR3aXN0aWUsICJVbnJlc29sdmVkIHRlbXBsYXRlczoiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuQ0FMTF9URU1QTEFURVMpOwotCQljcmVhdGVDb21ibyh0d2lzdGllLCAiTWlzc2luZyBwYXJhbWV0ZXJzOiIsIFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NSVNTSU5HX1BBUkFNKTsKLQkJY3JlYXRlQ29tYm8odHdpc3RpZSwgIlBhcmFtZXRlcnMgd2l0aG91dCB2YWx1ZToiLCBWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRU1QVFlfUEFSQU0pOwotCi0JCXR3aXN0aWUgPSBjcmVhdGVUd2lzdGllKGJvZHksIlhQYXRoIFByb2JsZW1zIiwyKTsKLQkJY3JlYXRlQ29tYm8odHdpc3RpZSwgIkluY29ycmVjdCBYUGF0aCBzeW50YXg6IiwgVmFsaWRhdGlvblByZWZlcmVuY2VzLlhQQVRIUyk7Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgcHJlZktleSkKLQl7Ci0JCUNvbWJvIGNvbWJvID0gc3VwZXIuY3JlYXRlQ29tYm8ocGFyZW50LCBsYWJlbCwgcHJlZktleSk7Ci0JCWNvbWJvLnNldEl0ZW1zKEVSUk9SUyk7Ci0JCWNvbWJvcy5wdXQocHJlZktleSwgY29tYm8pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0JewotCQlpbnQgbWF4RXJyb3JzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTUFYX0VSUk9SUyk7Ci0JCW1heEVycm9yc1RleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihtYXhFcnJvcnMpKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb21ibz4gZW50cnkgOiBjb21ib3MuZW50cnlTZXQoKSkKLQkJewotCQkJaW50IHZhbCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoZW50cnkuZ2V0S2V5KCkpOwotCQkJZW50cnkuZ2V0VmFsdWUoKS5zZWxlY3QoRVJST1JfTUFQLmdldCh2YWwpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkKLQl7Ci0JCWludCBtYXhFcnJvcnMgPSBJbnRlZ2VyLnBhcnNlSW50KG1heEVycm9yc1RleHQuZ2V0VGV4dCgpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NQVhfRVJST1JTLCBtYXhFcnJvcnMpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbWJvPiBlbnRyeSA6IGNvbWJvcy5lbnRyeVNldCgpKQotCQl7Ci0JCQlpbnQgaW5kZXggPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoZW50cnkuZ2V0S2V5KCksIEVSUk9SX1ZBTFVFU1tpbmRleF0pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKQotCXsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlpbnQgbWF4RXJyb3JzID0gSW50ZWdlci5wYXJzZUludChtYXhFcnJvcnNUZXh0LmdldFRleHQoKSk7Ci0JCQlpZiAobWF4RXJyb3JzIDwgMCkKLQkJCQllcnJvck1lc3NhZ2UgPSAiTWF4IGVycm9ycyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciI7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQllcnJvck1lc3NhZ2UgPSAiTWF4IGVycm9ycyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciI7Ci0JCX0KLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCXNldFZhbGlkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotCXsKLQkJaW50IG1heEVycm9ycyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KFZhbGlkYXRpb25QcmVmZXJlbmNlcy5NQVhfRVJST1JTKTsKLQkJbWF4RXJyb3JzVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKG1heEVycm9ycykpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbWJvPiBlbnRyeSA6IGNvbWJvcy5lbnRyeVNldCgpKQotCQl7Ci0JCQlpbnQgZGVmID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoZW50cnkuZ2V0S2V5KCkpOwotCQkJZW50cnkuZ2V0VmFsdWUoKS5zZWxlY3QoRVJST1JfTUFQLmdldChkZWYpKTsKLQkJfQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNMVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOWQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNMVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMjEzODQ5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotCi0vKioKLSAqIFhTTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2Ugc2V0cyB1cCB0aGUgdGVtcGxhdGUgcHJlZmVyZW5jZSBwYWdlIHRoYXQKLSAqIGNvbnRhaW5zIHRoZSB0ZW1wbGF0ZXMgZm9yIHhwYXRoLCB4cGF0aCAyLjAsIGF4aXMsIG9wZXJhdG9ycywgYW5kIAotICogZXhzbHQgZnVuY3Rpb25zLiAKLSAqIAotICogQGF1dGhvciBkY2FydmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWFNMVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFhNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFhTTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShYU0xVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXRUZW1wbGF0ZVN0b3JlKFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCkpOwotCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJWFNMVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDQ4ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWluUHJlZmVyZW5jZVBhZ2UuMD1FeHBhbmQgdGhlIHRyZWUgdG8gc2V0IHByZWZlcmVuY2VzIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yWFNMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JYU0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmEwZmY5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JYU0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JYTUw7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvclhTTCBleHRlbmRzIExpbmVTdHlsZVByb3ZpZGVyRm9yWE1MIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvclhTTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhTTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlWFNMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMWQ4M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlWFNMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUw7Ci0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlWFNMIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZQotewotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlWFNMKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IFZlcnNpb25UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYU0woKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3RlbXBsYXRlcy9WZXJzaW9uVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWFNMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1ZlcnNpb25UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYU0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxZmYwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1ZlcnNpb25UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYU0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFZlcnNpb25UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYU0wgZXh0ZW5kcyBTaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9UWVBFID0gZ2V0VmVyc2lvblR5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWZXJzaW9uVHlwZSgpCi0JewotCQlyZXR1cm4gInhzbF92ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBWZXJzaW9uVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWFNMKCkKLQl7Ci0JCXN1cGVyKFZFUlNJT05fVFlQRSwgIlhTTFQgVmVyc2lvbiBwcmVmZXJlbmNlIik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KQotCXsKLQkJLy8gVE9ETwotCQlyZXR1cm4gIjEuMCI7Ci0JCS8vIHJldHVybgotCQkvLyBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3V0aWwvWFNMUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC91dGlsL1hTTFBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhOTM1MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3V0aWwvWFNMUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAyMTM4NDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBkYXZpZCBjYXJ2ZXIgYmFzZWQgb24gd29yayBieSBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgWFNMUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIFhTTFBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWFNMUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBYU0xQbHVnaW5JbWFnZUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gWFNMVUlQbHVnaW4uUExVR0lOX0lEOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlCi0JICogaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJLy8gZG9udCBhZGQgdGhlIG1pc3NpbmcgaW1hZ2UgZGVzY3JpcHRvciBpbWFnZSB0byB0aGUgaW1hZ2UKLQkJCS8vIHJlZ2lzdHJ5Ci0JCQlpZiAoIWRlc2MuZXF1YWxzKEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkpKSB7Ci0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdXRpbC9YU0xQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC91dGlsL1hTTFBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZmMyMWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC91dGlsL1hTTFBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMjEzODQ5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBYU0wgUGx1Z2lucwotICovCi1wdWJsaWMgY2xhc3MgWFNMUGx1Z2luSW1hZ2VzIHsKLQotCS8qKgotCSAqIFBhdGggdG8gdGhlIFhQQVRIIEltYWdlcyB1c2VkIGZvciBDb250ZW50IEFzc2lzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19YUEFUSF9GVU5DVElPTiA9ICJpY29ucy9mdWxsL2Z1bmN0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBQYXRoIHRvIHRoZSBYUEFUSCBJbWFnZXMgdXNlZCBmb3IgQ29udGVudCBBc3Npc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfWFBBVEhfQVhJUyA9ICJpY29ucy9mdWxsL2RpcmVjdGlvbmFsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBQYXRoIHRvIHRoZSBYUEFUSCBJbWFnZXMgdXNlZCBmb3IgQ29udGVudCBBc3Npc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfVkFSSUFCTEVTID0gImljb25zL2Z1bGwvdmFyaWFibGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFBhdGggdG8gdGhlIFhQQVRIIEltYWdlcyB1c2VkIGZvciBDb250ZW50IEFzc2lzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PUEVSQVRPUiA9ICJpY29ucy9mdWxsL29wZXJhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRhNTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgYXMteW91LXR5cGUgdmFsaWRhdGlvbiBmb3IgeHNsIGZpbGVzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wgZXh0ZW5kcyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSWQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVmFsaWRhdG9yIF92YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNMKCkgewotCX0KLQotCXByaXZhdGUgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJaWYgKF92YWxpZGF0b3IgPT0gbnVsbCkKLQkJCV92YWxpZGF0b3IgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3IoSWQsbnVsbCk7Ci0JCXJldHVybiBfdmFsaWRhdG9yOwotCX0KLQotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCkgewotCQlWYWxpZGF0b3IgdiA9IGdldFZhbGlkYXRvcigpOwotCQlpZiAodiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB2LmFzSVZhbGlkYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYYWxhblhTTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhhbGFuWFNMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiODc4NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhhbGFuWFNMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgYXMteW91LXR5cGUgdmFsaWRhdGlvbiBmb3IgeHNsIGZpbGVzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYYWxhblhTTCBleHRlbmRzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJZCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUueHNsLnhhbGFuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBWYWxpZGF0b3IgX3ZhbGlkYXRvcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYYWxhblhTTCgpIHsKLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmIChfdmFsaWRhdG9yID09IG51bGwpCi0JCQlfdmFsaWRhdG9yID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9yKElkKTsKLQkJcmV0dXJuIF92YWxpZGF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0RGVsZWdhdGVWYWxpZGF0b3IoKSB7Ci0JCVZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0JCWlmICh2ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHYuYXNJVmFsaWRhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMRXJyb3JMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vWFNMRXJyb3JMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE0NTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTEVycm9yTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbGlzdGVucyBmb3IgRXJyb3JzIHRvc3NlZCBieSBhIFhTTCBQcm9jZXNzb3IuCi0gKiAKLSAqIEBhdXRob3IgZGNhcnZlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xFcnJvckxpc3RlbmVyIGltcGxlbWVudHMgRXJyb3JMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0KLQkvKioKLQkgKiBUT0RPOiBBZGQgSmF2YWRvYwotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKi8KLQlwdWJsaWMgWFNMRXJyb3JMaXN0ZW5lcihMb2dnZXIgbG9nZ2VyKSB7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uRXJyb3JMaXN0ZW5lciN3YXJuaW5nKGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgd2FybmluZyhUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQotCQlsb2dnZXIubG9nKExldmVsLldBUk5JTkcsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0KLQkJLy8gRG9uJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBzdG9wIHRoZSBwcm9jZXNzb3IKLQkJLy8ganVzdCBmb3IgYSB3YXJuaW5nOyBidXQgZG8gbG9nIHRoZSBwcm9ibGVtCi0JfQotCi0JLyoqIAotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uRXJyb3JMaXN0ZW5lciNlcnJvcihqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJCXRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0KLQkJbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JCS8vIFhTTFQgaXMgbm90IGFzIGRyYWNvbmlhbiBhcyBYTUwuIFRoZXJlIGFyZSBudW1lcm91cyBlcnJvcnMKLQkJLy8gd2hpY2ggdGhlIHByb2Nlc3NvciBtYXkgYnV0IGRvZXMgbm90IGhhdmUgdG8gcmVjb3ZlciBmcm9tOwotCQkvLyBlLmcuIG11bHRpcGxlIHRlbXBsYXRlcyB0aGF0IG1hdGNoIGEgbm9kZSB3aXRoIHRoZSBzYW1lCi0JCS8vIHByaW9yaXR5LiBJIGRvIG5vdCB3YW50IHRvIGFsbG93IHRoYXQgc28gSSB0aHJvdyB0aGlzCi0JCS8vIGV4Y2VwdGlvbiBoZXJlLgotCQl0aHJvdyBleGNlcHRpb247Ci0KLQl9Ci0KLQkvKioKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyI2ZhdGFsRXJyb3IoamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJCXRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0KLQkJbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0KLQkJLy8gVGhpcyBpcyBhbiBlcnJvciB3aGljaCB0aGUgcHJvY2Vzc29yIGNhbm5vdCByZWNvdmVyIGZyb207Ci0JCS8vIGUuZy4gYSBtYWxmb3JtZWQgc3R5bGVzaGVldCBvciBpbnB1dCBkb2N1bWVudAotCQkvLyBzbyBJIG11c3QgdGhyb3cgdGhpcyBleGNlcHRpb24gaGVyZS4KLQkJdGhyb3cgZXhjZXB0aW9uOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0xNYXJrdXBWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTE1hcmt1cFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ0M2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTTE1hcmt1cFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yOwotCi0vKioKLSAqIEBhdXRob3IgZGNhcnZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFhTTE1hcmt1cFZhbGlkYXRvciBleHRlbmRzIE1hcmt1cFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IsIElTb3VyY2VWYWxpZGF0b3IgewotCi0KLQkvKioKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yI2NsZWFudXAob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBoZWxwZXIgCi0JICogQHBhcmFtIHJlcG9ydGVyIAotCSAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0JCQl0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIudmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JfQotCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvciNjb25uZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAgICAgIHN1cGVyLmNvbm5lY3QoZG9jdW1lbnQpOwotCX0KLQotCS8qKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yI2Rpc2Nvbm5lY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuZGlzY29ubmVjdChkb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5NYXJrdXBWYWxpZGF0b3IjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwKLQkJCUlSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShkaXJ0eVJlZ2lvbiwgaGVscGVyLCByZXBvcnRlcik7Ci0JfQotCQotCS8qKiAKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLAotCQkJSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIudmFsaWRhdGUoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNMRmlsZVRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTTEZpbGVUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNGQzMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNMRmlsZVRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5YU0xVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLmludGVybmFsLlhTTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3WFNMRmlsZVRlbXBsYXRlc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld1hTTEZpbGVUZW1wbGF0ZXNXaXphcmRQYWdlKCkKLQl7Ci0JCXN1cGVyKCJOZXdTdHlsZXNoZWV0VGVtcGxhdGVzV2l6YXJkUGFnZSIsICJTZWxlY3QgWFNMIFRlbXBsYXRlIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oIlNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBmb3IgdGhlIHN0eWxlc2hlZXQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikKLQl7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpCi0JCQl7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpCi0JCQkJewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpCi0JCQkJewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucwotCQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpCi0JewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgSlNQIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dCgiVXNlIHRlbXBsYXRlIik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KCJUZW1wbGF0ZXMgYXJlICdOZXcgU3R5bGVzaGVldCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5YU0w8L2E+IHByZWZlcmVuY2UgcGFnZSIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoIk5hbWUiKTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0VGV4dCgiRGVzY3JpcHRpb24iKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKQotCQl7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKQotCQkJewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkKLQkJCQl7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpCi0JCQl7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTTCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLQl7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCJQcmV2aWV3Iik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkKLQl7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoZW5hYmxlZCkKLQkJewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlIGdldFNlbGVjdGVkVGVtcGxhdGUoKQotCXsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotCQl7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0VGVtcGxhdGVTdHJpbmcoKQotCXsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCXsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBYU0xVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShYU0xVSUNvbnN0YW50cy5URU1QTEFURV9DT05URVhUX1hTTF9ORVcpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IG5ldyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIDAsIDApOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJWFNMVUlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKQotCXsKLQkJU3RyaW5nIHBhZ2VJZCA9ICJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlbXBsYXRlLnByZWZlcmVuY2VQYWdlIjsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tdIHsgcGFnZUlkIH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKQotCXsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWFNMVUlDb25zdGFudHMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkKLQl7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJWFNMVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhTTFVJQ29uc3RhbnRzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCVhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKQotCXsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkKLQkJewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFhTTFVJQ29uc3RhbnRzLlRFTVBMQVRFX0NPTlRFWFRfWFNMX05FVyk7Ci0JCX0KLQotCQkvLyBubyByZWNvcmQgb2YgbGFzdCB1c2VkIHRlbXBsYXRlIHNvIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCWlmICh0ZW1wbGF0ZSA9PSBudWxsKQotCQl7Ci0JCQkvLyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQkJdGVtcGxhdGUgPSBmVGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApOwotCQl9Ci0KLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCXsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlbXBsYXRlKTsKLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlVmlld2VySW5wdXQoKQotCXsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQl7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0JewotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCQl7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkKLQkJewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoWFNMVUlDb25zdGFudHMuVEVNUExBVEVfQ09OVEVYVF9YU0xfTkVXKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLQkJewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCXsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KQotCQkJewotCQkJY2FzZSAwOgotCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTTEZpbGVXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTTEZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiNTNhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0xGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuWFNMVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBOZXdYU0xGaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZAotewotCXByaXZhdGUgTmV3WFNMRmlsZVdpemFyZFBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3WFNMRmlsZVRlbXBsYXRlc1dpemFyZFBhZ2UgZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkKLQl7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBOZXdYU0xGaWxlV2l6YXJkUGFnZSgiTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKTsgLy8kTk9OLU5MUy0xJCAKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKCJYU0wgU3R5bGVzaGVldCIpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oIkNyZWF0ZSBhIG5ldyBYU0wgU3R5bGVzaGVldC4iKTsKLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdYU0xGaWxlVGVtcGxhdGVzV2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKGZOZXdGaWxlVGVtcGxhdGVzUGFnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pCi0JewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoIk5ldyBYU0wgU3R5bGVzaGVldCIpOwotCi0JCS8vIFRPRE8gaW1hZ2UgZm9yIHdpemFyZAotCQkvLyBJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9Ci0JCS8vIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1dJWkJBTl9ORVdKU1BGSUxFKTsKLQkJLy8gc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0JewotCQlib29sZWFuIHBlcmZvcm1lZE9LID0gZmFsc2U7Ci0KLQkJLy8gc2F2ZSB1c2VyIG9wdGlvbnMgZm9yIG5leHQgdXNlCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZS5zYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gYWRkIGRlZmF1bHQgZXh0ZW5zaW9uCi0JCVN0cmluZyBmaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkKLQkJewotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJZk5ld0ZpbGVQYWdlLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIG5ldyBlbXB0eSBmaWxlCi0JCUlGaWxlIGZpbGUgPSBmTmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCi0JCS8vIGlmIHRoZXJlIHdhcyBwcm9ibGVtIHdpdGggY3JlYXRpbmcgZmlsZSwgaXQgd2lsbCBiZSBudWxsLCBzbyBtYWtlCi0JCS8vIHN1cmUgdG8gY2hlY2sKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJewotCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLmdldFRlbXBsYXRlU3RyaW5nKCk7Ci0JCQlpZiAodGVtcGxhdGVTdHJpbmcgIT0gbnVsbCkKLQkJCXsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQkJCXRyeQotCQkJCXsKLQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG51bGw7Ci0JCQkJCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBqdXN0IHVzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhclNldCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJWFNMVUlQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpCi0JewotCQlpZiAoZmlsZSAhPSBudWxsKQotCQl7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJCXsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQotCQkJCQl7Ci0JCQkJCQlYU0xVSVBsdWdpbi5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0xGaWxlV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNMRmlsZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4YjMzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0xGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS5YU0xDb3JlOwotCi1jbGFzcyBOZXdYU0xGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UKLXsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIE5ld1hTTEZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXNldEZpbGVOYW1lKCJOZXdGaWxlLnhzbCIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpCi0JewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkKLQkJewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkKLQkJewotCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKQotCQkJewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgiVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4iLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGNoZWNrIGFkZGluZyBkZWZhdWx0Ci0JCQkvLyBleHRlbnNpb24gZG9lc24ndCBlcXVhbCBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cwotCQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpCi0JCQl7Ci0JCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZnVsbFBhdGguYXBwZW5kKG5ld0ZpbGVOYW1lKTsKLQotCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKQotCQkJCXsKLQkJCQkJLy8gcGF0aCBpbnZhbGlkCi0JCQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWlmICgod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKS5leGlzdHMoKSkpCi0JCQkJewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoIlRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuIik7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJU3RyaW5nQnVmZmVyIG5ld0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihmaWxlbmFtZSk7Ci0KLQkJLy8gUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9Ci0JCS8vIFhTTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBTdHJpbmcgZXh0ID0KLQkJLy8gcHJlZmVyZW5jZS5nZXRTdHJpbmcoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJU3RyaW5nIGV4dCA9ICJ4c2wiOwotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkKLQl7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKFhTTENvcmUuWFNMX0NPTlRFTlRfVFlQRSk7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpCi0JewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKQotCQl7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkKLQl7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpCi0JCXsKLQkJCS8vIGNoZWNrIHdoYXQgY29udGVudCB0eXBlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgZXh0ZW5zaW9uCi0JCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZU5hbWUpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKQotCQkJewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wudWkvdGVtcGxhdGVzL2ZpbGVfdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS90ZW1wbGF0ZXMvZmlsZV90ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU2NTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS90ZW1wbGF0ZXMvZmlsZV90ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0ZW1wbGF0ZXM+Ci08dGVtcGxhdGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2x0LnRlbXBsYXRlcy54c2xfYmFzaWMiCi0gICAgICAgbmFtZT0iQmFzaWMgc3R5bGVzaGVldCIKLSAgICAgICBjb250ZXh0PSJ4c2xfbmV3IgotICAgICAgIGF1dG9pbnNlcnQ9InRydWUiCi0gICAgICAgZGVsZXRlZD0iZmFsc2UiCi0gICAgICAgZW5hYmxlZD0idHJ1ZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iTWF0Y2hlcyB0aGUgcm9vdCBvZiB0aGUgaW5wdXQiPjwhW0NEQVRBWzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9Ij8+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iJHt4c2xfdmVyc2lvbn0iIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQkJPCEtLSBUT0RPOiBBdXRvLWdlbmVyYXRlZCB0ZW1wbGF0ZSAtLT4ke2N1cnNvcn0KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+XV0+PC90ZW1wbGF0ZT4KLTx0ZW1wbGF0ZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbHQudGVtcGxhdGVzLnhzbF9jb3B5IgotICAgICBuYW1lPSJDb3B5IHN0eWxlc2hlZXQiCi0gICAgIGNvbnRleHQ9InhzbF9uZXciCi0gICAgIGF1dG9pbnNlcnQ9InRydWUiCi0gICAgIGRlbGV0ZWQ9ImZhbHNlIgotICAgICBlbmFibGVkPSJ0cnVlIgotICAgICBkZXNjcmlwdGlvbj0iTWFrZXMgYSBjb3B5IG9mIHRoZSBpbnB1dCI+PCFbQ0RBVEFbPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iPz4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIke3hzbF92ZXJzaW9ufSIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IiR7Y3Vyc29yfSI+Ci0JCTwhLS0gVE9ETzogQXV0by1nZW5lcmF0ZWQgdGVtcGxhdGUgLS0+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JPCEtLSBzdGFuZGFyZCBjb3B5IHRlbXBsYXRlIC0tPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+Ci0JCTx4c2w6Y29weT4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4KLQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQkJPC94c2w6Y29weT4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi08L3hzbDpzdHlsZXNoZWV0Pl1dPjwvdGVtcGxhdGU+Ci08L3RlbXBsYXRlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmRmOGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWRlYnVnZ2VyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjc2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWphdmFDb21waWxlci54YWxhbi1kZWJ1Z2dlci5qYXIuYXJncwotYnVpbGQueG1sCi14YWxhbi1kZWJ1Z2dlci5qYXIKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OTQwNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhMTMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEphbiAwMyAyMjoyNDo1MCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiYzM0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1N1biBEZWMgMTYgMDg6NDg6NTIgR01UIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZTY4YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jV2VkIEp1bCAzMCAyMDo1NzoxNSBCU1QgMjAwOAotY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCi1jb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKLWNvbXBpbGVycy5wLmludGVybmFsPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctYnVuZGxlLWNsYXNzcGF0aC1lbnRyaWVzPTAKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MgotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5zLmNyZWF0ZS1kb2NzPWZhbHNlCi1jb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYwotY29tcGlsZXJzLnMub3Blbi10YWdzPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGY4ZTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNS4wLnF1YWxpZmllcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyOwotICB1c2VzOj0ib3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlciwKLSAgIG9yZy5hcGFjaGUueHBhdGgsCi0gICBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLAotICAgamF2YXgueG1sLnRyYW5zZm9ybSwKLSAgIG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUueGFsYW47YnVuZGxlLXZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXI7YnVuZGxlLXZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWc7YnVuZGxlLXZlcnNpb249IlswLjUuMCwxLjAuMCkiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vWGFsYW5GZWF0dXJlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL1hhbGFuRmVhdHVyZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2ZGE3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vWGFsYW5GZWF0dXJlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU9QVElNSVpFPWh0dHA6Ly9hcGFjaGUub3JnL3hhbGFuL2ZlYXR1cmVzL29wdGltaXplCi1PUFRJTUlaRS5UWVBFPWJvb2xlYW4KLU9QVElNSVpFLkRFU0M9T3B0aW1pemUgc3R5bGVzaGVldCBwcm9jZXNzaW5nLiBCeSBkZWZhdWx0LCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZS4gWW91IG1heSBuZWVkIHRvIHNldCBpdCB0byBmYWxzZSBmb3IgdG9vbGluZyBhcHBsaWNhdGlvbnMuCi0KLUlOQ1JFTUVOVEFMPWh0dHA6Ly9hcGFjaGUub3JnL3hhbGFuL2ZlYXR1cmVzL2luY3JlbWVudGFsCi1JTkNSRU1FTlRBTC5UWVBFPWJvb2xlYW4KLUlOQ1JFTUVOVEFMLkRFU0M9UHJvZHVjZSBvdXRwdXQgaW5jcmVtZW50YWxseSwgcmF0aGVyIHRoYW4gd2FpdGluZyB0byBmaW5pc2ggcGFyc2luZyB0aGUgaW5wdXQgYmVmb3JlIGdlbmVyYXRpbmcgYW55IG91dHB1dC4gQnkgZGVmYXVsdCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gZmFsc2UuIFlvdSBjYW4gdHVybiB0aGlzIGF0dHJpYnV0ZSBvbiB0byB0cmFuc2Zvcm0gbGFyZ2UgZG9jdW1lbnRzIHdoZXJlIHRoZSBzdHlsZXNoZWV0IHN0cnVjdHVyZSBpcyBvcHRpbWl6ZWQgdG8gZXhlY3V0ZSBpbmRpdmlkdWFsIHRlbXBsYXRlcyB3aXRob3V0IGhhdmluZyB0byBwYXJzZSB0aGUgZW50aXJlIGRvY3VtZW50LgotCi1TT1VSQ0VfTE9DQVRJT049aHR0cDovL2FwYWNoZS5vcmcveGFsYW4vZmVhdHVyZXMvc291cmNlX2xvY2F0aW9uCi1TT1VSQ0VfTE9DQVRJT04uVFlQRT1ib29sZWFuCi1TT1VSQ0VfTE9DQVRJT04uREVTQz1CeSBkZWZhdWx0LCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gZmFsc2UuIFNldHRpbmcgdGhpcyBhdHRyaWJ1dGUgdG8gdHJ1ZSBpbnZvbHZlcyBhIHN1YnN0YW50aWFsIGluY3JlYXNlIGluIHN0b3JhZ2UgY29zdCBwZXIgc291cmNlIGRvY3VtZW50IG5vZGUuIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgTm9kZUluZm8gZXh0ZW5zaW9uIGZ1bmN0aW9ucyAob3Igc29tZSBvdGhlciBtZWNoYW5pc20pIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBkdXJpbmcgYSB0cmFuc2Zvcm0sIHlvdSBtdXN0IHNldCB0aGUgYXR0cmlidXRlIHRvIHRydWUgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIFRyYW5zZm9ybWVyIGFuZCBwcm9jZXNzaW5nIHRoZSBzdHlsZXNoZWV0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9YYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9YYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2ZDQ3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vWGFsYW5PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU19LRVlfSU5ERU5UX0FNT1VOVD17aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudAotU19LRVlfSU5ERU5UX0FNT1VOVC5ERVNDPVRoZSBudW1iZXIgb2Ygd2hpdGVzcGFjZXMgdG8gaW5kZW50IGJ5LCBpZiBpbmRlbnQ9InllcyIKLQotU19LRVlfRU5USVRJRVM9e2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWVudGl0aWVzCi1TX0tFWV9FTlRJVElFUy5ERVNDPUZpbGUgbmFtZSBvZiBmaWxlIHRoYXQgc3BlY2lmaWVzIGNoYXJhY3RlciB0byBlbnRpdHkgcmVmZXJlbmNlIG1hcHBpbmdzLgotCi1TX1VTRV9VUkxfRVNDQVBJTkc9e2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fXVzZS11cmwtZXNjYXBpbmcKLVNfVVNFX1VSTF9FU0NBUElORy5ERVNDPVVzZSBhIHZhbHVlIG9mICJ5ZXMiIGlmIHRoZSBocmVmIHZhbHVlcyBmb3IgSFRNTCBzZXJpYWxpemF0aW9uIHNob3VsZCB1c2UgJXh4IGVzY2FwaW5nCi0KLVNfT01JVF9NRVRBX1RBRz17aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9b21pdC1tZXRhLXRhZwotU19PTUlUX01FVEFfVEFHLkRFU0M9VXNlIGEgdmFsdWUgb2YgInllcyIgaWYgdGhlIE1FVEEgdGFnIHNob3VsZCBiZSBvbWl0dGVkIHdoZXJlIGl0IHdvdWxkIG90aGVyd2lzZSBiZSBzdXBwbGllZC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjcxZWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLi4gPSBzcmMtZGVidWdnZXIvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgWGFsYW5PdXRwdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgWGFsYW5GZWF0dXJlcy5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmRjNjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbgotQnVuZGxlLU5hbWUuMCA9IFhTTCBYYWxhbiBTdXBwb3J0IChJbmN1YmF0aW5nKQotcHJvY2Vzc29yVHlwZS5sYWJlbC4wID0gWGFsYW4KLXByb2Nlc3Nvci5sYWJlbC4wID0gWGFsYW4gMi41LjEKLXByb2Nlc3Nvci5sYWJlbC4xID0gWGFsYW4gMi43LjEKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4MWFlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnByb2Nlc3NvclR5cGUiPgotICAgICAgPHByb2Nlc3NvclR5cGUKLSAgICAgICAgICAgIGZlYXR1cmVQcm9wZXJ0aWVzPSJYYWxhbkZlYXR1cmVzLnByb3BlcnRpZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlIgotICAgICAgICAgICAgbGFiZWw9IiVwcm9jZXNzb3JUeXBlLmxhYmVsLjAiCi0gICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzPSJYYWxhbk91dHB1dFByb3BlcnRpZXMucHJvcGVydGllcyIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyRmFjdG9yeT0ib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCI+Ci0gICAgICA8L3Byb2Nlc3NvclR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5kZWJ1Z2dlciI+Ci0gICAgICA8ZGVidWdnZXIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlci5YYWxhbkRlYnVnZ2VyIgotICAgICAgICAgICAgY2xhc3NwYXRoPSIke2VjbGlwc2Vfb3JiaXQ6b3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbn0iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlciIKLSAgICAgICAgICAgIG5hbWU9IlhhbGFuIDIuNS4xIG9yIGdyZWF0ZXIiCi0gICAgICAgICAgICBwcm9jZXNzb3JUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4ucHJvY2Vzc29yVHlwZSI+Ci0gICAgICA8L2RlYnVnZ2VyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcucHJvY2Vzc29yIj4KLSAgICAgIDwhLS0gQW4gYWRvcHRlciBjYW4gc3BlY2lmeSB0aGUgJHtlY2xpcHNlX29yYml0OiB9IHZhcmlhYmxlIHRvIGluZGljYXRlIHdoaWNoIGVjbGlwc2UKLSAgICAgICAgICAgYnVuZGxlIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgY2xhc3MgcGF0aC4gLS0+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBjbGFzc3BhdGg9IiR7ZWNsaXBzZV9vcmJpdDpvcmcuYXBhY2hlLnhhbGFufTske2VjbGlwc2Vfb3JiaXQ6b3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcn0iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcueGFsYW4ucHJvY2Vzc29yIgotICAgICAgICAgICAgbGFiZWw9IiVwcm9jZXNzb3IubGFiZWwuMSIKLSAgICAgICAgICAgIHByb2Nlc3NvclR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5wcm9jZXNzb3JUeXBlIgotICAgICAgICAgICAgZGVidWdnZXJJZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi5kZWJ1Z2dlciIKLSAgICAgICAgICAgIHN1cHBvcnRzPSIxLjAiPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuRGVidWdnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhbkRlYnVnZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODZjZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuRGVidWdnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVG9vTWFueUxpc3RlbmVyc0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuVHJhY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuQWJzdHJhY3REZWJ1Z2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnZ2VyLlZhcmlhYmxlOwotCi1wdWJsaWMgY2xhc3MgWGFsYW5EZWJ1Z2dlciBleHRlbmRzIEFic3RyYWN0RGVidWdnZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWGFsYW5EZWJ1Z2dlci5jbGFzcyk7Ci0JcHJpdmF0ZSBYYWxhblRyYWNlTGlzdGVuZXIgY3VycmVudFRyYWNlTGlzdGVuZXI7Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXJGYWN0b3J5KFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCB0ZmkgPSAoVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCkgZmFjdG9yeTsKLQkJdGZpLnNldEF0dHJpYnV0ZShUcmFuc2Zvcm1lckZhY3RvcnlJbXBsLkZFQVRVUkVfU09VUkNFX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCQl0Zmkuc2V0QXR0cmlidXRlKFRyYW5zZm9ybWVyRmFjdG9yeUltcGwuRkVBVFVSRV9PUFRJTUlaRSwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVHJhbnNmb3JtZXIoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpCi0JewotCQlUcmFuc2Zvcm1lckltcGwgdHJhbnNmb3JtZXJJbXBsID0gKFRyYW5zZm9ybWVySW1wbCkgdHJhbnNmb3JtZXI7Ci0JCVRyYWNlTWFuYWdlciB0ck1nciA9IHRyYW5zZm9ybWVySW1wbC5nZXRUcmFjZU1hbmFnZXIoKTsKLQkJdHJ5Ci0JCXsKLS8vCQkJWGFsYW5QcmludFRyYWNlTGlzdGVuZXIgcHJpbnRlciA9IG5ldyBYYWxhblByaW50VHJhY2VMaXN0ZW5lcihuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVycikpOwotLy8JCQlwcmludGVyLm1fdHJhY2VFbGVtZW50cyA9IHRydWU7Ci0vLwkJCXByaW50ZXIubV90cmFjZVNlbGVjdGlvbiA9IHRydWU7Ci0vLwkJCXByaW50ZXIubV90cmFjZVRlbXBsYXRlcyA9IHRydWU7Ci0vLwkJCXRyTWdyLmFkZFRyYWNlTGlzdGVuZXIocHJpbnRlcik7Ci0JCQkKLQkJCVhhbGFuVHJhY2VMaXN0ZW5lciB0cmFjZUxpc3RlbmVyID0gbmV3IFhhbGFuVHJhY2VMaXN0ZW5lcih0aGlzKTsKLQkJCXRyTWdyLmFkZFRyYWNlTGlzdGVuZXIodHJhY2VMaXN0ZW5lcik7Ci0JCX0KLQkJY2F0Y2ggKFRvb01hbnlMaXN0ZW5lcnNFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgVmFyaWFibGUgZ2V0VmFyaWFibGUoaW50IGlkKQotCXsKLQkJcmV0dXJuIGN1cnJlbnRUcmFjZUxpc3RlbmVyLmdldFZhcmlhYmxlKGlkKTsKLQl9Ci0KLQl2b2lkIHNldEN1cnJlbnRUcmFjZUxpc3RlbmVyKFhhbGFuVHJhY2VMaXN0ZW5lciBjdXJyZW50VHJhY2VMaXN0ZW5lcikKLQl7Ci0JCWxvZy5kZWJ1ZygiU2V0dGluZyBuZXcgWGFsYW5UcmFjZUxpc3RlbmVyIik7Ci0JCXRoaXMuY3VycmVudFRyYWNlTGlzdGVuZXIgPSBjdXJyZW50VHJhY2VMaXN0ZW5lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5QcmludFRyYWNlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblByaW50VHJhY2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDZjMDdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblByaW50VHJhY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ2hhc2UgVGVjaG5vbG9neSBMdGQgLSBodHRwOi8vd3d3LmNoYXNldGVjaG5vbG9neS5jby51awotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wueGFsYW4uZGVidWdnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuRWxlbVRleHRMaXRlcmFsOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuRW5kU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5QcmludFRyYWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlRyYWNlckV2ZW50OwotCi1wdWJsaWMgY2xhc3MgWGFsYW5QcmludFRyYWNlTGlzdGVuZXIgZXh0ZW5kcyBQcmludFRyYWNlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFByaW50V3JpdGVyIHdyaXRlcjsKLQotCXB1YmxpYyBYYWxhblByaW50VHJhY2VMaXN0ZW5lcihQcmludFdyaXRlciBwdykKLQl7Ci0JCXN1cGVyKHB3KTsKLQkJdGhpcy53cml0ZXIgPSBwdzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBfdHJhY2UoVHJhY2VyRXZlbnQgZXYpCi0JewotCQlzd2l0Y2ggKGV2Lm1fc3R5bGVOb2RlLmdldFhTTFRva2VuKCkpCi0JCXsKLQkJCWNhc2UgQ29uc3RhbnRzLkVMRU1OQU1FX1RFWFRMSVRFUkFMUkVTVUxUOgotCQkJCWlmIChtX3RyYWNlRWxlbWVudHMpCi0JCQkJewotCQkJCQl3cml0ZXIucHJpbnQoZXYubV9zdHlsZU5vZGUuZ2V0U3lzdGVtSWQoKSArICIgTGluZSAjIiArIGV2Lm1fc3R5bGVOb2RlLmdldExpbmVOdW1iZXIoKSArICIsICIgKyAiQ29sdW1uICMiICsgZXYubV9zdHlsZU5vZGUuZ2V0Q29sdW1uTnVtYmVyKCkgKyAiIC0tICIgKyBldi5tX3N0eWxlTm9kZS5nZXROb2RlTmFtZSgpCi0JCQkJCQkJKyAiOiAiKTsKLQotCQkJCQlFbGVtVGV4dExpdGVyYWwgZXRsID0gKEVsZW1UZXh0TGl0ZXJhbCkgZXYubV9zdHlsZU5vZGU7Ci0JCQkJCVN0cmluZyBjaGFycyA9IG5ldyBTdHJpbmcoZXRsLmdldENoYXJzKCksIDAsIGV0bC5nZXRDaGFycygpLmxlbmd0aCk7Ci0KLQkJCQkJd3JpdGVyLnByaW50bG4oIiAgICAiICsgY2hhcnMudHJpbSgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENvbnN0YW50cy5FTEVNTkFNRV9URU1QTEFURToKLQkJCQlpZiAobV90cmFjZVRlbXBsYXRlcyB8fCBtX3RyYWNlRWxlbWVudHMpCi0JCQkJewotCQkJCQlFbGVtVGVtcGxhdGUgZXQgPSAoRWxlbVRlbXBsYXRlKSBldi5tX3N0eWxlTm9kZTsKLQotCQkJCQl3cml0ZXIucHJpbnQoZXQuZ2V0U3lzdGVtSWQoKSArICIgTGluZSAjIiArIGV0LmdldExpbmVOdW1iZXIoKSArICIsICIgKyAiQ29sdW1uICMiICsgZXQuZ2V0Q29sdW1uTnVtYmVyKCkgKyAiOiAiICsgZXQuZ2V0Tm9kZU5hbWUoKSArICIgIik7Ci0KLQkJCQkJaWYgKG51bGwgIT0gZXQuZ2V0TWF0Y2goKSkKLQkJCQkJewotCQkJCQkJd3JpdGVyLnByaW50KCJtYXRjaD0nIiArIGV0LmdldE1hdGNoKCkuZ2V0UGF0dGVyblN0cmluZygpICsgIicgIik7Ci0JCQkJCX0KLQotCQkJCQlpZiAobnVsbCAhPSBldC5nZXROYW1lKCkpCi0JCQkJCXsKLQkJCQkJCXdyaXRlci5wcmludCgibmFtZT0nIiArIGV0LmdldE5hbWUoKSArICInICIpOwotCQkJCQl9Ci0KLQkJCQkJd3JpdGVyLnByaW50bG4oKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWlmIChtX3RyYWNlRWxlbWVudHMpCi0JCQkJewotCQkJCQl3cml0ZXIKLQkJCQkJCQkucHJpbnRsbihldi5tX3N0eWxlTm9kZS5nZXRTeXN0ZW1JZCgpICsgIiBMaW5lICMiICsgZXYubV9zdHlsZU5vZGUuZ2V0TGluZU51bWJlcigpICsgIiwgIiArICJDb2x1bW4gIyIgKyBldi5tX3N0eWxlTm9kZS5nZXRDb2x1bW5OdW1iZXIoKSArICI6ICIKLQkJCQkJCQkJCSsgZXYubV9zdHlsZU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXYpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJd3JpdGVyLnByaW50KCJzZWxlY3RlZDogIik7Ci0JCXN1cGVyLnNlbGVjdGVkKGV2KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0RW5kKEVuZFNlbGVjdGlvbkV2ZW50IGV2KSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLQl7Ci0JCXdyaXRlci5wcmludCgic2VsZWN0RW5kOiAiKTsKLQkJc3VwZXIuc2VsZWN0RW5kKGV2KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHJhY2UoVHJhY2VyRXZlbnQgZXYpCi0JewotCQl3cml0ZXIucHJpbnQoInRyYWNlOiAiKTsKLQkJc3VwZXIudHJhY2UoZXYpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0cmFjZUVuZChUcmFjZXJFdmVudCBldikKLQl7Ci0JCXdyaXRlci5wcmludCgidHJhY2VFbmQ6ICIpOwotCQlfdHJhY2UoZXYpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblJvb3RTdHlsZUZyYW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wueGFsYW4vc3JjLWRlYnVnZ2VyL29yZy9lY2xpcHNlL3dzdC94c2wveGFsYW4vZGVidWdnZXIvWGFsYW5Sb290U3R5bGVGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjQ2NGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblJvb3RTdHlsZUZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMuU3R5bGVzaGVldFJvb3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5UcmFjZXJFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlZhcmlhYmxlU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5WYXJpYWJsZTsKLQotcHVibGljIGNsYXNzIFhhbGFuUm9vdFN0eWxlRnJhbWUgZXh0ZW5kcyBYYWxhblN0eWxlRnJhbWUKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWGFsYW5Sb290U3R5bGVGcmFtZS5jbGFzcyk7Ci0JcHJpdmF0ZSBNYXAgdmFyaWFibGVzOwotCXByaXZhdGUgQXJyYXlMaXN0IGdsb2JhbHM7Ci0KLQlwdWJsaWMgWGFsYW5Sb290U3R5bGVGcmFtZShUcmFjZXJFdmVudCBldmVudCkKLQl7Ci0JCXN1cGVyKG51bGwsIGV2ZW50KTsKLQkJZmlsbEdsb2JhbHMoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEdsb2JhbHMoKQotCXsKLQkJcmV0dXJuIGdsb2JhbHM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaWxsR2xvYmFscyhUcmFjZXJFdmVudCBldmVudCkKLQl7Ci0JCVZhcmlhYmxlU3RhY2sgdnMgPSBldmVudC5tX3Byb2Nlc3Nvci5nZXRYUGF0aENvbnRleHQoKS5nZXRWYXJTdGFjaygpOwotCSAgICBTdHlsZXNoZWV0Um9vdCBzciA9IGV2ZW50Lm1fc3R5bGVOb2RlLmdldFN0eWxlc2hlZXRSb290KCk7Ci0JICAgIFZlY3RvciB2YXJzID0gc3IuZ2V0VmFyaWFibGVzQW5kUGFyYW1zQ29tcG9zZWQoKTsKLQkJdmFyaWFibGVzID0gbmV3IEhhc2hNYXAodmFycy5zaXplKCkpOwotCQlnbG9iYWxzID0gbmV3IEFycmF5TGlzdCh2YXJzLnNpemUoKSk7Ci0JICAgIGludCBpID0gdmFycy5zaXplKCk7Ci0JICAgIHdoaWxlICgtLWkgPj0gMCkKLQkJewotCQkJRWxlbVZhcmlhYmxlIHZhcmlhYmxlID0gKEVsZW1WYXJpYWJsZSkgdmFycy5lbGVtZW50QXQoaSk7Ci0JCQlYYWxhblZhcmlhYmxlIHh2YXIgPSBuZXcgWGFsYW5WYXJpYWJsZSh0aGlzLHZzLFZhcmlhYmxlLkdMT0JBTF9TQ09QRSxpLHZhcmlhYmxlKTsKLQkJCWFkZFZhcmlhYmxlKHh2YXIpOwotCQkJZ2xvYmFscy5hZGQoeHZhcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmFyaWFibGUgZ2V0VmFyaWFibGUoaW50IGlkKQotCXsKLS8vCQlsb2cuZGVidWcoIkdldHRpbmcgdmFyaWFibGUgd2l0aCBpZCAiK2lkKyIgZnJvbSB2YXJpYWJsZXMgIit2YXJpYWJsZXMuc2l6ZSgpKTsKLQkJcmV0dXJuIChWYXJpYWJsZSl2YXJpYWJsZXMuZ2V0KG5ldyBJbnRlZ2VyKGlkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVmFyaWFibGUoWGFsYW5WYXJpYWJsZSB4dmFyKQotCXsKLS8vCQlsb2cuZGVidWcoIkFkZGluZyB2YXJpYWJsZSBpbmRleD0iK3h2YXIuZ2V0U2xvdE51bWJlcigpKyIgdmFsPSIreHZhcik7Ci0vLwkJdmFyaWFibGVzLmFkZCh4dmFyLmdldFNsb3ROdW1iZXIoKSx4dmFyKTsKLQkJbG9nLmRlYnVnKCJBZGRpbmcgdmFyaWFibGUgaWQ9Iit4dmFyLmdldElkKCkpOwotCQl2YXJpYWJsZXMucHV0KG5ldyBJbnRlZ2VyKHh2YXIuZ2V0SWQoKSkseHZhcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuU3R5bGVGcmFtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuU3R5bGVGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjFlYTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblN0eWxlRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtQ2FsbFRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1UZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcy5FbGVtVGVtcGxhdGVFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1WYXJpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLlRyYWNlckV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLmR0bS5yZWYuRFRNTm9kZVByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnV0aWxzLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGguVmFyaWFibGVTdGFjazsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlhQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuU3R5bGVGcmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnZ2VyLlZhcmlhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYYWxhblN0eWxlRnJhbWUgZXh0ZW5kcyBTdHlsZUZyYW1lCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFhhbGFuU3R5bGVGcmFtZS5jbGFzcyk7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCB2YXJOYW1lczsKLQlwcml2YXRlIGZpbmFsIFN0YWNrIGV2ZW50U3RhY2sgPSBuZXcgU3RhY2soKTsKLQlmaW5hbCBUcmFjZXJFdmVudCBldmVudDsKLQlwcml2YXRlIGludCBjdXJyZW50TGluZTsKLQlwcml2YXRlIFhhbGFuUm9vdFN0eWxlRnJhbWUgcm9vdFN0eWxlRnJhbWU7Ci0KLQlwdWJsaWMgWGFsYW5TdHlsZUZyYW1lKFN0eWxlRnJhbWUgcGFyZW50LCBUcmFjZXJFdmVudCBldmVudCkKLQl7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJdGhpcy52YXJOYW1lcyA9IG5ldyBIYXNoTWFwKCgoWGFsYW5TdHlsZUZyYW1lKSBwYXJlbnQpLnZhck5hbWVzKTsKLQkJZWxzZQotCQkJdGhpcy52YXJOYW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXB1c2hFbGVtZW50KGV2ZW50KTsKLQkJZmluZFJvb3RTdHlsZUZyYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRSb290U3R5bGVGcmFtZSgpCi0JewotCQlYYWxhblN0eWxlRnJhbWUgZnJhbWUgPSB0aGlzOwotCQlkbwotCQl7Ci0JCQlpZiAoZnJhbWUgaW5zdGFuY2VvZiBYYWxhblJvb3RTdHlsZUZyYW1lKQotCQkJCXJvb3RTdHlsZUZyYW1lID0gKFhhbGFuUm9vdFN0eWxlRnJhbWUpIGZyYW1lOwotCQl9Ci0JCXdoaWxlICgoZnJhbWUgPSAoWGFsYW5TdHlsZUZyYW1lKSBmcmFtZS5nZXRQYXJlbnQoKSkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCi0JewotCQlyZXR1cm4gZXZlbnQubV9zdHlsZU5vZGUuZ2V0U3R5bGVzaGVldCgpLmdldFN5c3RlbUlkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCVN0cmluZyBuYW1lID0gZXZlbnQubV9zdHlsZU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKGV2ZW50Lm1fc3R5bGVOb2RlIGluc3RhbmNlb2YgRWxlbVRlbXBsYXRlKQotCQl7Ci0JCQlFbGVtVGVtcGxhdGUgZXQgPSAoRWxlbVRlbXBsYXRlKSBldmVudC5tX3N0eWxlTm9kZTsKLQkJCVFOYW1lIHEgPSBldC5nZXROYW1lKCk7Ci0JCQlpZiAocSAhPSBudWxsKQotCQkJewotCQkJCW5hbWUgKz0gIiBuYW1lPVwiIiArIHEuZ2V0TG9jYWxOYW1lKCkgKyAiXCIiOwotCQkJfQotCQkJWFBhdGggeHAgPSBldC5nZXRNYXRjaCgpOwotCQkJaWYgKHhwICE9IG51bGwpCi0JCQl7Ci0JCQkJbmFtZSArPSAiIG1hdGNoPVwiIiArIHhwLmdldFBhdHRlcm5TdHJpbmcoKSArICJcIiI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQubV9zdHlsZU5vZGUgaW5zdGFuY2VvZiBFbGVtQ2FsbFRlbXBsYXRlKQotCQl7Ci0JCQlFbGVtQ2FsbFRlbXBsYXRlIGV0ID0gKEVsZW1DYWxsVGVtcGxhdGUpIGV2ZW50Lm1fc3R5bGVOb2RlOwotCQkJUU5hbWUgcSA9IGV0LmdldE5hbWUoKTsKLQkJCWlmIChxICE9IG51bGwpCi0JCQl7Ci0JCQkJbmFtZSArPSAiIG5hbWU9XCIiICsgcS5nZXRMb2NhbE5hbWUoKSArICJcIiI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VmFyaWFibGVTdGFjaygpCi0JewotCQlMaXN0IHZhcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhcnMuYWRkQWxsKGdldExvY2FscygpKTsKLQkJdmFycy5hZGRBbGwoZ2V0R2xvYmFscygpKTsKLQkJcmV0dXJuIHZhcnM7Ci0JfQotCi0JcHVibGljIGludCBnZXRDdXJyZW50TGluZSgpCi0JewotCQlyZXR1cm4gY3VycmVudExpbmU7Ci0JfQotCi0JcHVibGljIHZvaWQgcHVzaEVsZW1lbnQoVHJhY2VyRXZlbnQgZSkKLQl7Ci0JCWN1cnJlbnRMaW5lID0gZS5tX3N0eWxlTm9kZS5nZXRMaW5lTnVtYmVyKCk7Ci0JCWV2ZW50U3RhY2sucHVzaChlKTsKLQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotCQkJbG9nLmRlYnVnKCJQdXNoZWQgZWxlbWVudCAiICsgVHJhY2VyRXZlbnQucHJpbnROb2RlKGUubV9zdHlsZU5vZGUpICsgIiBhdCBsaW5lICIgKyBjdXJyZW50TGluZSk7Ci0JfQotCi0JcHVibGljIFRyYWNlckV2ZW50IHBvcEVsZW1lbnQoKQotCXsKLQkJVHJhY2VyRXZlbnQgZSA9IChUcmFjZXJFdmVudCkgZXZlbnRTdGFjay5wb3AoKTsKLQkJY3VycmVudExpbmUgPSBlLm1fc3R5bGVOb2RlLmdldEVuZExpbmVOdW1iZXIoKTsKLQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotCQkJbG9nLmRlYnVnKCJQb3BwZWQgZWxlbWVudCAiICsgVHJhY2VyRXZlbnQucHJpbnROb2RlKGUubV9zdHlsZU5vZGUpICsgIiBhdCBsaW5lICIgKyBjdXJyZW50TGluZSk7Ci0KLQkJRWxlbVRlbXBsYXRlRWxlbWVudCBlbGVtZW50ID0gZS5tX3N0eWxlTm9kZTsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JCWxvZy5kZWJ1ZygiIG5hbWUgIiArIG5hbWUpOwotCQlpZiAobmFtZS5lcXVhbHMoInBhcmFtIikgfHwgbmFtZS5lcXVhbHMoInZhcmlhYmxlIikpCi0JCQlhZGRWYXJpYWJsZSgoRWxlbVZhcmlhYmxlKSBlLm1fc3R5bGVOb2RlKTsKLQotCQlyZXR1cm4gZTsKLQl9Ci0KLQlwdWJsaWMgVHJhY2VyRXZlbnQgcGVla0VsZW1lbnQoKQotCXsKLQkJaWYgKGV2ZW50U3RhY2suaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoVHJhY2VyRXZlbnQpIGV2ZW50U3RhY2sucGVlaygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRWYXJpYWJsZShFbGVtVmFyaWFibGUgdmFyaWFibGUpCi0JewotCQlTdHJpbmcgc2NvcGUgPSB2YXJpYWJsZS5nZXRJc1RvcExldmVsKCkgPyBWYXJpYWJsZS5HTE9CQUxfU0NPUEUgOiBWYXJpYWJsZS5MT0NBTF9TQ09QRTsKLQkJVmFyaWFibGVTdGFjayB2cyA9IGV2ZW50Lm1fcHJvY2Vzc29yLmdldFhQYXRoQ29udGV4dCgpLmdldFZhclN0YWNrKCk7Ci0JCVhhbGFuVmFyaWFibGUgeHZhciA9IG5ldyBYYWxhblZhcmlhYmxlKHRoaXMsIHZzLCBzY29wZSwgdmFyaWFibGUuZ2V0SW5kZXgoKSwgdmFyaWFibGUpOwotCQlyb290U3R5bGVGcmFtZS5hZGRWYXJpYWJsZSh4dmFyKTsKLQkJdmFyTmFtZXMucHV0KHZhcmlhYmxlLmdldE5hbWUoKSwgeHZhcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldExvY2FscygpCi0JewotCQlMaXN0IGxvY2FscyA9IG5ldyBBcnJheUxpc3QodmFyTmFtZXMudmFsdWVzKCkpOwotCQkvLyBzb3J0IGJ5IHNsb3ROdW1iZXIKLQkJQ29sbGVjdGlvbnMuc29ydChsb2NhbHMpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCh2YXJOYW1lcy52YWx1ZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0R2xvYmFscygpCi0JewotCQlyZXR1cm4gcm9vdFN0eWxlRnJhbWUuZ2V0R2xvYmFscygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlRmlsZW5hbWUoKQotCXsKLQkJU291cmNlTG9jYXRvciBsb2NhdG9yID0gZ2V0U291cmNlTG9jYXRvcigpOwotCQlpZiAobG9jYXRvciAhPSBudWxsKQotCQkJcmV0dXJuIGxvY2F0b3IuZ2V0U3lzdGVtSWQoKTsKLQkJcmV0dXJuICIiOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U291cmNlQ3VycmVudExpbmUoKQotCXsKLQkJU291cmNlTG9jYXRvciBsb2NhdG9yID0gZ2V0U291cmNlTG9jYXRvcigpOwotCQlpZiAobG9jYXRvciAhPSBudWxsKQotCQkJcmV0dXJuIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHJpdmF0ZSBTb3VyY2VMb2NhdG9yIGdldFNvdXJjZUxvY2F0b3IoKQotCXsKLQkJTm9kZSBzb3VyY2VOb2RlID0gZXZlbnQubV9zb3VyY2VOb2RlOwotICAgICAgICBTb3VyY2VMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCQlpZiAoc291cmNlTm9kZSBpbnN0YW5jZW9mIERUTU5vZGVQcm94eSkKLQkJewotCQkJaW50IG5vZGVIYW5kbGVyID0gKChEVE1Ob2RlUHJveHkpIHNvdXJjZU5vZGUpLmdldERUTU5vZGVOdW1iZXIoKTsKLQkJCXJldHVybiAoKERUTU5vZGVQcm94eSkgc291cmNlTm9kZSkuZ2V0RFRNKCkuZ2V0U291cmNlTG9jYXRvckZvcihub2RlSGFuZGxlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuVHJhY2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuVHJhY2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNhNDQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblRyYWNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLkVuZFNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuRXh0ZW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5HZW5lcmF0ZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi50cmFjZS5UcmFjZUxpc3RlbmVyRXgyOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udHJhY2UuVHJhY2VyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5kZWJ1Z2dlci5CcmVha1BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuVmFyaWFibGU7Ci0KLXB1YmxpYyBjbGFzcyBYYWxhblRyYWNlTGlzdGVuZXIgaW1wbGVtZW50cyBUcmFjZUxpc3RlbmVyRXgyIC8vVHJhY2VMaXN0ZW5lckV4MwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYYWxhblRyYWNlTGlzdGVuZXIuY2xhc3MpOwotCi0JcHJpdmF0ZSBmaW5hbCBYYWxhbkRlYnVnZ2VyIGRlYnVnZ2VyOwotCXByaXZhdGUgWGFsYW5Sb290U3R5bGVGcmFtZSByb290U3R5bGVGcmFtZTsKLQkKLQlwdWJsaWMgWGFsYW5UcmFjZUxpc3RlbmVyKFhhbGFuRGVidWdnZXIgZGVidWdnZXIpCi0JewotCQl0aGlzLmRlYnVnZ2VyID0gZGVidWdnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhY2UoVHJhY2VyRXZlbnQgZXYpCi0JewotCQlYYWxhblN0eWxlRnJhbWUgc3R5bGVGcmFtZSA9IG51bGw7Ci0JCWlmIChyb290U3R5bGVGcmFtZSA9PSBudWxsKQotCQl7Ly8gdGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgc3RhY2sKLQkJCWRlYnVnZ2VyLmRlYnVnZ2VyVHJhbnNmb3JtU3RhcnRlZCgpOwotCQkJZGVidWdnZXIuc2V0Q3VycmVudFRyYWNlTGlzdGVuZXIodGhpcyk7Ci0JCQlyb290U3R5bGVGcmFtZSA9IG5ldyBYYWxhblJvb3RTdHlsZUZyYW1lKGV2KTsKLQkJCXN0eWxlRnJhbWUgPSByb290U3R5bGVGcmFtZTsKLQkJCWRlYnVnZ2VyLnB1c2hTdHlsZUZyYW1lKHN0eWxlRnJhbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGV2Lm1fc3R5bGVOb2RlLmdldE93bmVyWFNMVGVtcGxhdGUoKSA9PSBldi5tX3N0eWxlTm9kZSkKLQkJey8vIHRoaXMgaXMgYW4geHNsOnRlbXBsYXRlLCBzbyBhZGQgdG8gdGVtcGxhdGUgc3RhY2sKLQkJCXN0eWxlRnJhbWUgPSBuZXcgWGFsYW5TdHlsZUZyYW1lKGRlYnVnZ2VyLnBlZWtTdHlsZUZyYW1lKCksIGV2KTsKLQkJCWRlYnVnZ2VyLnB1c2hTdHlsZUZyYW1lKHN0eWxlRnJhbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGV2Lm1fc3R5bGVOb2RlLmdldFhTTFRva2VuKCkgIT0gQ29uc3RhbnRzLkVMRU1OQU1FX1RFWFRMSVRFUkFMUkVTVUxUKQotCQl7Ly8gYWRkIHRvIGN1cnJlbnQgdGVtcGxhdGUgZWxlbWVudCBzdGFjawotCQkJc3R5bGVGcmFtZSA9IChYYWxhblN0eWxlRnJhbWUpIGRlYnVnZ2VyLnBlZWtTdHlsZUZyYW1lKCk7Ci0JCQlzdHlsZUZyYW1lLnB1c2hFbGVtZW50KGV2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWxvZy5kZWJ1ZygiU2tpcHBlZCBwdXNoIGZvciBlbGVtZW50ICIrZXYubV9zdHlsZU5vZGUuZ2V0TG9jYWxOYW1lKCkpOwotCQl9Ci0JCWNoZWNrKHN0eWxlRnJhbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyYWNlRW5kKFRyYWNlckV2ZW50IGV2KQotCXsKLQkJWGFsYW5TdHlsZUZyYW1lIHN0eWxlRnJhbWUgPSAoWGFsYW5TdHlsZUZyYW1lKSBkZWJ1Z2dlci5wZWVrU3R5bGVGcmFtZSgpOwotCQlpZiAoc3R5bGVGcmFtZSE9bnVsbCkKLQkJewotCQkJaWYgKGV2Lm1fc3R5bGVOb2RlLmdldE93bmVyWFNMVGVtcGxhdGUoKSA9PSBldi5tX3N0eWxlTm9kZSkKLQkJCXsvLyByZW1vdmUgZnJvbSBjdXJyZW50IHRlbXBsYXRlIGVsZW1lbnQgc3RhY2sKLQkJCQlzdHlsZUZyYW1lLnBvcEVsZW1lbnQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGV2Lm1fc3R5bGVOb2RlLmdldFhTTFRva2VuKCkgIT0gQ29uc3RhbnRzLkVMRU1OQU1FX1RFWFRMSVRFUkFMUkVTVUxUKQotCQkJey8vIHJlbW92ZSBmcm9tIGN1cnJlbnQgdGVtcGxhdGUgZWxlbWVudCBzdGFjawotCQkJCXN0eWxlRnJhbWUucG9wRWxlbWVudCgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWxvZy5kZWJ1ZygiU2tpcHBlZCBwb3AgZm9yIGVsZW1lbnQgIitldi5tX3N0eWxlTm9kZS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQl9Ci0JCQljaGVjayhzdHlsZUZyYW1lKTsKLQkJCWlmIChldi5tX3N0eWxlTm9kZS5nZXRPd25lclhTTFRlbXBsYXRlKCkgPT0gZXYubV9zdHlsZU5vZGUpCi0JCQl7Ly8gZW5kIG9mIHRlbXBsYXRlLCBzbyByZW1vdmUgZnJvbSBzdGFjawotCQkJCWRlYnVnZ2VyLnBvcFN0eWxlRnJhbWUoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsvLyBiZWNhdXNlIHdlIGRvbid0IGdldCBzZWxlY3RFbmQgZXZlbnRzLCB3ZSBuZWVkIHRvIGRvIHRoaXMgY2hlY2sKLQkJCQlUcmFjZXJFdmVudCB0ZWwgPSBzdHlsZUZyYW1lLnBlZWtFbGVtZW50KCk7Ci0JCQkJLy8gaWYgdGhlIHBhcmVudCBpcyBhIGNob29zZSwgbW92ZSBvbiB0byBpdAotCQkJCXN3aXRjaCAodGVsLm1fc3R5bGVOb2RlLmdldFhTTFRva2VuKCkpCi0JCQkJewotCQkJCQljYXNlIENvbnN0YW50cy5FTEVNTkFNRV9DSE9PU0U6Ci0JCQkJCQlzdHlsZUZyYW1lLnBvcEVsZW1lbnQoKTsKLQkJCQkJCWNoZWNrKHN0eWxlRnJhbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2hlY2soWGFsYW5TdHlsZUZyYW1lIHN0eWxlRnJhbWUpCi0JewotCQlkZWJ1Z2dlci5jaGVja1N0b3BwZWQoKTsKLQkJaWYgKHN0eWxlRnJhbWUhPW51bGwpCi0JCXsKLQkJCS8vIGNoZWNrIGJyZWFrcG9pbnQgaW4gc3R5bGVzaGVldAotCQkJQnJlYWtQb2ludCBicmVha3BvaW50ID0gbmV3IEJyZWFrUG9pbnQoc3R5bGVGcmFtZS5nZXRGaWxlbmFtZSgpLCBzdHlsZUZyYW1lLmdldEN1cnJlbnRMaW5lKCkpOwotCQkJZGVidWdnZXIuY2hlY2tTdXNwZW5kZWQoc3R5bGVGcmFtZSwgYnJlYWtwb2ludCk7Ci0JCQkvLyBUT0RPIGNoZWNrIGJyZWFrcG9pbnQgaW4gc291cmNlCi0vKgkJCWJyZWFrcG9pbnQgPSBuZXcgQnJlYWtQb2ludChzdHlsZUZyYW1lLmdldFNvdXJjZUZpbGVuYW1lKCksIHN0eWxlRnJhbWUuZ2V0U291cmNlQ3VycmVudExpbmUoKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLSIrYnJlYWtwb2ludCk7Ci0JCQlpZiAoYnJlYWtwb2ludC5nZXRGaWxlKCkgIT0gbnVsbCkKLQkJCQlkZWJ1Z2dlci5jaGVja1N1c3BlbmRlZChzdHlsZUZyYW1lLCBicmVha3BvaW50KTsKLSovCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXYpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXt9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3RFbmQoRW5kU2VsZWN0aW9uRXZlbnQgZXYpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXt9Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZWQoR2VuZXJhdGVFdmVudCBldikKLQl7fQotCi0JcHVibGljIHZvaWQgZXh0ZW5zaW9uKEV4dGVuc2lvbkV2ZW50IGVlKQotCXt9Ci0KLQlwdWJsaWMgdm9pZCBleHRlbnNpb25FbmQoRXh0ZW5zaW9uRXZlbnQgZWUpCi0Je30KLQotCXB1YmxpYyBWYXJpYWJsZSBnZXRWYXJpYWJsZShpbnQgaWQpCi0JewotCQlyZXR1cm4gcm9vdFN0eWxlRnJhbWUuZ2V0VmFyaWFibGUoaWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuVmFyaWFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC54YWxhbi9zcmMtZGVidWdnZXIvb3JnL2VjbGlwc2Uvd3N0L3hzbC94YWxhbi9kZWJ1Z2dlci9YYWxhblZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjdlZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuL3NyYy1kZWJ1Z2dlci9vcmcvZWNsaXBzZS93c3QveHNsL3hhbGFuL2RlYnVnZ2VyL1hhbGFuVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWsKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuLmRlYnVnZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzLkVsZW1WYXJpYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhwYXRoLlZhcmlhYmxlU3RhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhOb2RlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cy5YT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZGVidWdnZXIuVmFyaWFibGU7Ci0KLXB1YmxpYyBjbGFzcyBYYWxhblZhcmlhYmxlIGV4dGVuZHMgVmFyaWFibGUgaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWGFsYW5WYXJpYWJsZS5jbGFzcyk7Ci0JcHJpdmF0ZSBmaW5hbCBFbGVtVmFyaWFibGUgZWxlbVZhcmlhYmxlOwotCXByaXZhdGUgZmluYWwgVmFyaWFibGVTdGFjayB2YXJTdGFjazsKLQlwcml2YXRlIGludCBzdGFja0ZyYW1lOwotCi0JcHVibGljIFhhbGFuVmFyaWFibGUoWGFsYW5TdHlsZUZyYW1lIHhhbGFuU3R5bGVGcmFtZSwgVmFyaWFibGVTdGFjayB2YXJTdGFjaywgU3RyaW5nIHNjb3BlLCBpbnQgc2xvdE51bWJlciwgRWxlbVZhcmlhYmxlIGVsZW1WYXJpYWJsZSkKLQl7Ci0JCXN1cGVyKGdldE5hbWUoZWxlbVZhcmlhYmxlLHNjb3BlLHhhbGFuU3R5bGVGcmFtZSksIHNjb3BlLCBzbG90TnVtYmVyK3ZhclN0YWNrLmdldFN0YWNrRnJhbWUoKSk7Ci0JCXRoaXMuZWxlbVZhcmlhYmxlID0gZWxlbVZhcmlhYmxlOwotCQl0aGlzLnZhclN0YWNrID0gdmFyU3RhY2s7Ci0JCS8vIGdldCB0aGUgc3RhY2sgZnJhbWUgYXQgdGhpcyBjdXJyZW50IHBvaW50IGluIHRpbWUKLQkJdGhpcy5zdGFja0ZyYW1lID0gdmFyU3RhY2suZ2V0U3RhY2tGcmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROYW1lKEVsZW1WYXJpYWJsZSBlbGVtVmFyaWFibGUsIFN0cmluZyBzY29wZSwgWGFsYW5TdHlsZUZyYW1lIHhhbGFuU3R5bGVGcmFtZSkKLQl7Ci0JCVN0cmluZyBuYW1lID0gZWxlbVZhcmlhYmxlLmdldE5hbWUoKS5nZXRMb2NhbE5hbWUoKTsKLQkJU3RyaW5nIHN5c3RlbUlkID0gZWxlbVZhcmlhYmxlLmdldFN0eWxlc2hlZXQoKS5nZXRTeXN0ZW1JZCgpOwotCQlpZiAoR0xPQkFMX1NDT1BFLmVxdWFscyhzY29wZSkgJiYgc3lzdGVtSWQgIT0gbnVsbCkKLQkJewotCQkJaW50IGluZGV4OwotCQkJaWYgKChpbmRleCA9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJykpID4gMCkKLQkJCQluYW1lICs9ICIgKCIgKyBzeXN0ZW1JZC5zdWJzdHJpbmcoaW5kZXggKyAxKSArICIpIjsKLQkJCWVsc2UKLQkJCQluYW1lICs9ICIgKCIgKyBzeXN0ZW1JZCArICIpIjsKLQkJfQotLy8JCWVsc2UgaWYgKExPQ0FMX1NDT1BFLmVxdWFscyhzY29wZSkpCi0vLwkJewotLy8JCQluYW1lICs9ICIgKCIgKyB4YWxhblN0eWxlRnJhbWUuZ2V0TmFtZSgpICsgIikiOwotLy8JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0JewotCQlTdHJpbmcgdmFsdWUgPSBVTktOT1dOOwotCQl0cnkKLQkJewotCQkJWE9iamVjdCB4b2JqZWN0ID0gZ2V0WE9iamVjdCgpOwotCQkJaWYgKHhvYmplY3QgIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnQgeGFsYW5UeXBlID0geG9iamVjdC5nZXRUeXBlKCk7Ci0JCQkJc3dpdGNoICh4YWxhblR5cGUpCi0JCQkJewotCQkJCQljYXNlIFhPYmplY3QuQ0xBU1NfVU5SRVNPTFZFRFZBUklBQkxFOgotCQkJCQkJdmFsdWUgPSBVTlJFU09MVkVEOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19OT0RFU0VUOgotCQkJCQkJdmFsdWUgPSBOT0RFU0VUOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19CT09MRUFOOgotCQkJCQkJdmFsdWUgPSBCT09MRUFOOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19OVU1CRVI6Ci0JCQkJCQl2YWx1ZSA9IE5VTUJFUjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFhPYmplY3QuQ0xBU1NfVU5LTk9XTjoKLQkJCQkJCXZhbHVlID0gVU5LTk9XTjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFhPYmplY3QuQ0xBU1NfU1RSSU5HOgotCQkJCQlkZWZhdWx0OgotCQkJCQkJdmFsdWUgPSBTVFJJTkc7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotCXsKLQkJU3RyaW5nIHZhbHVlID0gIj8/PyI7Ci0JCXRyeQotCQl7Ci0JCQlYT2JqZWN0IHhvYmplY3QgPSBnZXRYT2JqZWN0KCk7Ci0JCQlpZiAoeG9iamVjdCAhPSBudWxsKQotCQkJewotCQkJCWludCB4YWxhblR5cGUgPSB4b2JqZWN0LmdldFR5cGUoKTsKLQkJCQlzd2l0Y2ggKHhhbGFuVHlwZSkKLQkJCQl7Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19VTlJFU09MVkVEVkFSSUFCTEU6Ci0JCQkJCQl2YWx1ZSA9ICIiOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19OT0RFU0VUOgotCQkJCQkJWE5vZGVTZXQgeG5zID0gKFhOb2RlU2V0KSB4b2JqZWN0OwotCQkJCQkJaWYgKHhucy5ub2RlbGlzdCgpLmdldExlbmd0aCgpID4gMCkKLQkJCQkJCQl2YWx1ZSA9ICgoWE5vZGVTZXQpIHhvYmplY3QpLm5vZGVsaXN0KCkuaXRlbSgwKS50b1N0cmluZygpOwotCQkJCQkJZWxzZQotCQkJCQkJCXZhbHVlID0gIjxFTVBUWSBOT0RFU0VUPiI7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBYT2JqZWN0LkNMQVNTX0JPT0xFQU46Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19OVU1CRVI6Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19TVFJJTkc6Ci0JCQkJCWNhc2UgWE9iamVjdC5DTEFTU19VTktOT1dOOgotCQkJCQlkZWZhdWx0OgotCQkJCQkJdmFsdWUgPSB4b2JqZWN0LnRvU3RyaW5nKCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLS8vCQl2YWx1ZSA9IGdldFNjb3BlKCkrIi4iK2dldFNsb3ROdW1iZXIoKSsiKSIrZ2V0TmFtZSgpOwkKLS8vCQlsb2cuZGVidWcoZ2V0U2NvcGUoKSsiLiIrZ2V0U2xvdE51bWJlcigpKyIpIitnZXROYW1lKCkgKyAiPSIgKyB2YWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwcml2YXRlIFhPYmplY3QgZ2V0WE9iamVjdCgpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotCXsKLQkJWE9iamVjdCB4dmFsdWU7Ci0JCWlmIChlbGVtVmFyaWFibGUuZ2V0SXNUb3BMZXZlbCgpKQotCQkJeHZhbHVlID0gdmFyU3RhY2suZWxlbWVudEF0KHNsb3ROdW1iZXIpOwotCQllbHNlCi0JCQl4dmFsdWUgPSB2YXJTdGFjay5nZXRMb2NhbFZhcmlhYmxlKGVsZW1WYXJpYWJsZS5nZXRJbmRleCgpLCBzdGFja0ZyYW1lKTsKLQkJcmV0dXJuIHh2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgYXJnMCkKLQl7Ci0JCVhhbGFuVmFyaWFibGUgeHZhciA9IChYYWxhblZhcmlhYmxlKWFyZzA7Ci0JCWludCBjb21wID0geHZhci5zdGFja0ZyYW1lIC0gc3RhY2tGcmFtZTsKLQkJaWYgKGNvbXAgPT0gMCkKLQkJCWNvbXAgPSBzbG90TnVtYmVyIC0geHZhci5zbG90TnVtYmVyOwotCQlyZXR1cm4gY29tcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNWEzY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhzbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjZkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5tYXBwaW5ncyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYWJvdXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDYwZjk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V1RQIFhTTCBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHRcblwKLSAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSxcblwKLSAgRGF2aWQgQ2FydmVyIChTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwpXG5cCi0gIGFuZCBvdGhlcnMgMjAwOC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFhZTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB3dHBfcHJvZDMyLmdpZixcCi0gICAgICAgICAgICAgICB3dHBfcHJvZDMyLnBuZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWE0M2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnhzbAotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBXVFAgWFNMIFRvb2xzIChJbmN1YmF0aW5nKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC93dHBfcHJvZDMyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvd3RwX3Byb2QzMi5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2wvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNsL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9idWlsZC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2wuZG9jL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzlmMDRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNsLmRvYy9idWlsZC54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdCBkZWZhdWx0PSJjcmVhdGUtZG9jIiBiYXNlZGlyPSIuIj4KKworCTxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50LWxvYyIgbG9jYXRpb249Ii4iIC8+CisJPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZSIgbG9jYXRpb249Ii4uIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJodG1sZGlyIiB2YWx1ZT0iJHtjdXJyZW50LWxvY30vaHRtbCIgLz4KKwk8cHJvcGVydHkgbmFtZT0iZG9jYm9va2RpciIgdmFsdWU9IiR7d29ya3NwYWNlfS9Db21tb25VdGlsaXRpZXMvZG9jYm9vay14c2wvZWNsaXBzZSIgLz4KKwk8cHJvcGVydHkgbmFtZT0iZG9jYm9va3NvdXJjZSIgdmFsdWU9IiR7Y3VycmVudC1sb2N9L2RvY2Jvb2siLz4KKwk8cHJvcGVydHkgbmFtZT0ieGFsYW4iIHZhbHVlPSJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIiAvPgorCisJPCEtLSBYU0xUIENodW5raW5nIFByb3BlcnRpZXMgLS0+CisJPHByb3BlcnR5IG5hbWU9ImJhc2UuZGlyIiB2YWx1ZT0iJHtodG1sZGlyfSIvPgorCQorCTx0YXJnZXQgbmFtZT0ibWVyZ2UiPgorCQk8eHNsLnhpbmNsdWRlIGluPSIke2RvY2Jvb2tzb3VyY2V9L3hzbGhlbHAuZGJrIiBvdXQ9IiR7ZG9jYm9va3NvdXJjZX0veHNsaGVscGNvbWJpbmVkLmRiayIvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJjcmVhdGUtZG9jIiBkZXBlbmRzPSJtZXJnZSI+CisKKwkJPHhzbHQgZm9yY2U9InRydWUiIHN0eWxlPSIke2RvY2Jvb2tkaXJ9L2VjbGlwc2UzMy54c2wiIGluPSIke2RvY2Jvb2tzb3VyY2V9L3hzbGhlbHBjb21iaW5lZC5kYmsiIG91dD0idGVzdC54bWwiPgorCQkJPGZhY3RvcnkgbmFtZT0iJHt4YWxhbn0iIC8+CisJCQk8cGFyYW0gbmFtZT0ibWFuaWZlc3QiIGV4cHJlc3Npb249IjEiLz4KKwkJCTxwYXJhbSBuYW1lPSJiYXNlLmRpciIgZXhwcmVzc2lvbj0iJHtodG1sZGlyfS8iLz4KKwkJCTxwYXJhbSBuYW1lPSJjcmVhdGUucGx1Z2luLnhtbCIgZXhwcmVzc2lvbj0iMCIvPgorCQkJPHBhcmFtIG5hbWU9ImNodW5rZXIub3V0cHV0LmluZGVudCIgZXhwcmVzc2lvbj0ieWVzIi8+CisJCQk8cGFyYW0gbmFtZT0ibmF2aWcuc2hvd3RpdGxlcyIgZXhwcmVzc2lvbj0iMCIvPgorCQkJPHBhcmFtIG5hbWU9InN1cHByZXNzLm5hdmlnYXRpb24iIGV4cHJlc3Npb249IjEiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJnZW5lcmF0ZS50b2MiIGV4cHJlc3Npb249ImJvb2sgICAgICB0b2MsdGl0bGUsZmlndXJlCitjaGFwdGVyICAgdG9jLHRpdGxlCitzZWN0aW9uICAgdGl0bGUiIC8+CisJCTwveHNsdD4KKwkJCisJCTxyZXBsYWNlIGZpbGU9IiR7Y3VycmVudC1sb2N9L3RvYy54bWwiIHRva2VuPSIke2N1cnJlbnQtbG9jfS8iIHZhbHVlPSIiLz4KKwk8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWVlNjFkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotICAgIDxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZTwvbmFtZT4KLSAgICA8Y29tbWVudD48L2NvbW1lbnQ+Ci0gICAgPHByb2plY3RzPjwvcHJvamVjdHM+Ci0gICAgPGJ1aWxkU3BlYz4KLSAgICAgICAgPGJ1aWxkQ29tbWFuZD4KLSAgICAgICAgICAgIDxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLSAgICAgICAgICAgIDxhcmd1bWVudHM+PC9hcmd1bWVudHM+Ci0gICAgICAgIDwvYnVpbGRDb21tYW5kPgotICAgIDwvYnVpbGRTcGVjPgotICAgIDxuYXR1cmVzPgotICAgICAgICA8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0gICAgPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1MGRmMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIERlYyAxNiAxNjo1Nzo1NyBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ4NTY4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMDk6MDQ6NDMgRVNUIDIwMDgKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiMDIxMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjYyNzcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9WFNMIFRvb2xzIChJbmN1YmF0aW5nKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVhTTFQgRWRpdG9yLCB2YWxpZGF0b3IsIGxhdW5jaGluZyBhbmQgZGVidWdnaW5nIHN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCksXG5cCi1EYXZpZCBDYXJ2ZXIgKFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCkgYW5kIG90aGVycyAyMDA4LlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrKVxuXAotICAgIERhdmlkIENhcnZlciAoU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIC0gaHR0cDovL3d3dy5zdGFyc3RhbmRhcmQub3JnKVxuXAotICAgIEplc3BlciBNb2xsZXIgKE5pbmVDb25zdWx0IC0gaHR0cDovL3d3dy5uaW5lY29uc3VsdC5kaylcbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4ODUwZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54c2wiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamR0IiB2ZXJzaW9uPSIzLjQuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuZGVidWciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmRlYnVnLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnhhbGFuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGgudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhhbGFuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmRvYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzbC5zYXhvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNlNjY1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjFiYTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XVFAgWFNMIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSwgRGF2aWQgQ2FydmVyIChTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwpXG5cCi1hbmQgb3RoZXJzIDIwMDguIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM0MWNhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotcGx1Z2luTmFtZT1XVFAgWFNMIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDk1ZmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVhTTCBUb29scyBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgV1RQIFhTTC4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCksXG5cCi1EYXZpZCBDYXJ2ZXIgKFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCkgYW5kIG90aGVycyAyMDA4LlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrKVxuXAotICAgIERhdmlkIENhcnZlciAoU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIC0gaHR0cDovL3d3dy5zdGFyc3RhbmRhcmQub3JnKVxuXAotICAgIEplc3BlciBNb2xsZXIgKE5pbmVDb25zdWx0IC0gaHR0cDovL3d3dy5uaW5lY29uc3VsdC5kaylcbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUsIDIwMDhcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M5OGIxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdUUCBYU0wgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBEb3VnIFNhdGNod2VsbCAoQ2hhc2UgVGVjaG5vbG9neSBMdGQpLCBEYXZpZCBDYXJ2ZXIgKFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbClcblwKLWFuZCBvdGhlcnMgMjAwOC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzQxY2EuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wbHVnaW5OYW1lPVdUUCBYU0wgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTU0ZTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzUwZGYxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIERlYyAxNiAxNjo1Nzo1NyBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDg1NjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMDk6MDQ6NDMgRVNUIDIwMDgKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNjYjc2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC54c2wuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LnhzbC5mZWF0dXJlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzA2OTE4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1YU0wgVG9vbHMgU0RLIChJbmN1YmF0aW5nKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVhTTFQgRWRpdG9yLCB2YWxpZGF0b3IsIGxhdW5jaGluZyBhbmQgZGVidWdnaW5nIHN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCksXG5cCi1EYXZpZCBDYXJ2ZXIgKFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCkgYW5kIG90aGVycyAyMDA4LlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIERvdWcgU2F0Y2h3ZWxsIChDaGFzZSBUZWNobm9sb2d5IEx0ZCAtIGh0dHA6Ly93d3cuY2hhc2V0ZWNobm9sb2d5LmNvLnVrKVxuXAotICAgIERhdmlkIENhcnZlciAoU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIC0gaHR0cDovL3d3dy5zdGFyc3RhbmRhcmQub3JnKVxuXAotICAgIEplc3BlciBNb2xsZXIgKE5pbmVDb25zdWx0IC0gaHR0cDovL3d3dy5uaW5lY29uc3VsdC5kaylcbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQ3YjcyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wuc2RrLmRvY3VtZW50YXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2U2NjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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=